替代在Lambda中使用三元运算符

时间:2013-06-20 16:42:40

标签: c# linq lambda resharper ternary-operator

目前..我的代码看起来像这样。

PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty,

PhoneNumbers是ICollection<PhoneNumber>

这也在.Select()中,所以我无法在外面为它创建变量。

Resharper抱怨说x.PhoneNumbers.FirstOrDefault()可能是空的,说实话,并不是因为我要做两次FirstOrDefault的想法而卖掉。

任何其他想法,我想可能有另一种Lambda方法,我可以做类似的事情。

3 个答案:

答案 0 :(得分:12)

PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",

答案 1 :(得分:8)

第一个选项,如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, "");

答案 2 :(得分:0)

var result = new List<Product>();

result = result.Where(o => o.Name == (string.IsNullOrEmpty(_nameParameter) ? o.Name : _nameParameter)).ToList();