4

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

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

PhoneNumbers 是一个ICollection<PhoneNumber>

这也在 a 中.Select(),所以我不能真正在外面为它创建一个变量。

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

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

4

3 回答 3

12
PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "",
于 2013-06-20T16:45:44.687 回答
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, "");
于 2013-06-20T16:45:50.600 回答
0
var result = new List<Product>();

result = result.Where(o => o.Name == (string.IsNullOrEmpty(_nameParameter) ? o.Name : _nameParameter)).ToList();
于 2014-03-23T17:22:22.133 回答