在 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 中使用三元运算符的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

三元运算和lambda

在三元运算符中初始化捕获 lambda

如何使用条件三元运算符在 lambda 之间有条件地分配 Func<>?

从三元运算符返回 lambda [重复]

Python-三元运算符和lambda表达式

使用 Python 的三元运算符与 lambda 组合的意外输出