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

jae*_*kie 4 c# linq resharper lambda ternary-operator

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

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

PhoneNumbers是一个 ICollection<PhoneNumber>

这也是一个.Select(),所以我不能真正为它创建一个变量.

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

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

Mar*_*rot 12

PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

第一个选择,如Markus的:

PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
                            .FirstOrDefault() ?? "";
Run Code Online (Sandbox Code Playgroud)

另一种选择:

PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber)
                            .DefaultIfEmpty("")
                            .First();
Run Code Online (Sandbox Code Playgroud)

或者如果你发现自己做了很多,你可以编写自己的方法来结合这两者:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后:

PhoneNumber = x.PhoneNumbers.ProjectedFirstOrDefault(x => x.PhoneNumber, "");
Run Code Online (Sandbox Code Playgroud)

  • @Servy:嗯,这要么是提供替代方案的问题,要么只是删除我的答案。(事实上​​,在我想到其他选择之前,我确实删除了我的答案。) (2认同)