我会避免使用异常。您可以使用新的C#6空值传播运算符:
myList.Where(x=> x.Property?.Property2 == 5)
或者这种简单的方法:
myList.Where(x=> x.Property != null && x.Property.Property2 == 5)
然而,如果你真的想要抛出异常,我会使用一个简单的循环,这也更容易调试。这是推荐的,因为LINQ查询不应该引起副作用或抛出异常:
https://msdn.microsoft.com/en-us/library/bb513730.aspx
然而,我们建议您避免在查询表达式中调用任何可能会产生副作用的方法,例如修改数据源内容或抛出异常。
因此,您可以选择已经展示过的foreach循环(我的最爱),或者使用try-catch语句:
List<MyType> myLstResult = null;
try
{
myLstResult = myList.Where(x=> x.Property.Property2 == 5).ToList();
}
catch(NullReferenceException nullref)
{
throw new ArgumentNullException("MyType.Property must not be null", nullref);
}
Rene 展示了另一种方法,我不建议抛出异常。这在像 Linq-To-Sql
或 Linq-To-Entities
这样的 LINQ 提供程序中无法翻译,并违反了上述准则。
更新:也许像这样的 ThrowIfArgumentNull
扩展方法会很方便:
public static IEnumerable<TSource> ThrowIfArgumentNull<TSource, TNullable>(this IEnumerable<TSource> enumeration, Func<TSource, TNullable> mightBeNullSelector, string argumentName)
where TNullable : class
{
foreach (TSource item in enumeration)
{
if (mightBeNullSelector(item) == null)
throw new ArgumentNullException(argumentName);
yield return item;
}
}
你会这样使用它:
List<MyType> myLstresult = myList
.ThrowIfArgumentNull(x => x.Property, "MyType.Property")
.Where(x => x.Property.Property2 == 5)
.ToList();
myList.Where(x=> x.Property?.Property2 == 5);
的问题是什么? - Royi NamirArgumentNullException
,而不是 避免 它。 - René Vogt