C# 在Lambda中使用三元运算符的替代方法

C# 在Lambda中使用三元运算符的替代方法,c#,linq,lambda,resharper,ternary-operator,C#,Linq,Lambda,Resharper,Ternary Operator,目前。。我的代码看起来像这样 PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty, PhoneNumber=x.PhoneNumber.FirstOrDefault()!=无效的x、 PhoneNumber.FirstOrDefault().PhoneNumber:string.Empty, 电话号码是一个i集合 这也是

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

PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty, PhoneNumber=x.PhoneNumber.FirstOrDefault()!=无效的x、 PhoneNumber.FirstOrDefault().PhoneNumber:string.Empty, 电话号码是一个
i集合

这也是在一个
.Select()
中,所以我不能在外部为它创建变量

Resharper抱怨说,
x.PhoneNumbers.FirstOrDefault()
可能是空的,老实说,我不相信我必须做两次FirstOrDefault


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

第一种选择,比如Markus的:

PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",
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);
}
var result=newlist();
result=result.Where(o=>o.Name==(string.IsNullOrEmpty(_nameparmeter)?o.Name:_nameparmeter)).ToList();

好吧,这段代码的最大问题是,您将序列迭代了两次。如果它代表一个数据库查询(看起来是这样的),那…非常糟糕。我同意,绝对不是最好的主意,因为我正在将数据库的结果操纵到一个模型中,因为它来自一个数据库,所以最好只使用一个存储过程并将结果映射到一个复杂类型。我这样做是因为涉及到为了报告/显示目的而连接和聚合数据。@Servy:这要么是提供替代方案的问题,要么只是删除我的答案。(事实上,我确实删除了我的答案,直到我想到其他选择。)
PhoneNumber = x.PhoneNumbers.ProjectedFirstOrDefault(x => x.PhoneNumber, "");
var result = new List<Product>();

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