在 Lambda 中使用三元运算符的替代方法
Posted
技术标签:
【中文标题】在 Lambda 中使用三元运算符的替代方法【英文标题】:Alternative to using a ternary operator in Lambda 【发布时间】:2013-06-17 15:17:06 【问题描述】:目前..我的代码如下所示。
PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty,PhoneNumbers 是 ICollection<PhoneNumber>
这也在.Select()
中,所以我不能真正在外面为它创建一个变量。
Resharper 抱怨 x.PhoneNumbers.FirstOrDefault()
可能为空,老实说,并不是因为我必须执行两次 FirstOrDefault 的想法而出售。
任何其他想法,我在想可能有另一种 Lambda 方法我可以做类似的事情。
【问题讨论】:
嗯,该代码的最大问题是您将序列迭代两次。如果它代表一个数据库查询(似乎是这种情况),那......非常糟糕。 我同意,这绝对不是最好的主意,因为这是我将数据库中的结果操作到模型中 由于这是来自数据库,最好简单地使用存储过程并将结果映射到复杂类型。在为报告/显示目的加入和聚合数据的情况下,我已经这样做了。 【参考方案1】:PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",
【讨论】:
【参考方案2】:第一个选项,如 Markus 的:
PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
.FirstOrDefault() ?? "";
另一种选择:
PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
.DefaultIfEmpty("")
.First();
或者,如果您发现自己经常这样做,您可以编写自己的方法来将两者结合起来:
public static TElement ProjectedFirstOrDefault<TSource, TElement>
(this IEnumerable<TSource> source,
Func<TSource, TElement> selector,
TElement defaultValue) where TElement : class
var firstElement = source.FirstOrDefault();
return firstElement == null ? defaultValue : selector(firstElement);
然后:
PhoneNumber = x.PhoneNumbers.ProjectedFirstOrDefault(x => x.PhoneNumber, "");
【讨论】:
@Servy:嗯,这要么是提供替代方案,要么只是删除我的答案。 (事实上,在我想到替代方案之前,我确实删除了我的答案。)【参考方案3】:var result = new List<Product>();
result = result.Where(o => o.Name == (string.IsNullOrEmpty(_nameParameter) ? o.Name : _nameParameter)).ToList();
【讨论】:
以上是关于在 Lambda 中使用三元运算符的替代方法的主要内容,如果未能解决你的问题,请参考以下文章