使用linq之前检查list是否为null

Zen*_*Zac 0 c# linq null-check

我想使用LINQ检查myList!= null,然后执行Where。

我知道我会写

if (myList != null { myList.Where(p => p.x == 2 && p.y == 3); }

但我想使用: myList?.Where(p => p.x == 2 && p.y == 3);

这样行吗?

如果没有,您还知道其他哪些优雅的解决方案?

Fab*_*bio 6

是的,list?.Where(i => i > 1)是一个合法的表达式,称为“空传播算符”。

使用空传播运算符的一个问题是,您将开始像这样编写代码

var result = list?.Where(i => i > 1)?.Select(i => i * 2)?.Where(i => i % 2 == 0)?.ToList();
// result can be null and still requires check for null
Run Code Online (Sandbox Code Playgroud)

..您还知道其他哪些优雅的解决方案?

另一种优雅的解决方案是确保每当函数返回一个集合时,它就不会返回null而是一个空集合。

这样的约定将使您的代码更易于阅读和理解代码的实际意图,使其易于测试(减少要测试的测试用例),减少“嘈杂的null检查”。

请注意,LINQ扩展方法从不返回null

如果您使用的是可返回null集合的库,但您无权访问代码-将“转换” null为空集合并继续用作有效集合。

var checkedList = givenList ?? Enumerable.Empty<int>();
checkedList.Where(i => i > 1).ToList();
Run Code Online (Sandbox Code Playgroud)

如果发现自己经常这样做,请创建一个扩展方法。

public IEnumerable<T> EmptyIfNull(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();     
}
Run Code Online (Sandbox Code Playgroud)

用法

var result = givenList.EmptyIfNull().Where(i => i > 1).ToList();
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用 C# 6 / Visual Studio 2013 或更高版本进行构建,则允许您编写:

var result = myList?.Where(p => p.x == 2 && p.y == 3);
Run Code Online (Sandbox Code Playgroud)

因此, if myListis nullWhere不会被评估,并且result将会是null, else ,其类型为结果查询(IEnumerable<T>IQueryable<T>)。

空条件运算符

你也可以写:

var result = myList?.Where(p => p.x == 2 && p.y == 3) ?? someValue;
Run Code Online (Sandbox Code Playgroud)

因此,如果myListnullresult将由 分配someValue

空合并运算符

您可以检查 中的选项Project Settings > Build > Advanced options > Language version

  • 小扩展 `var result = myList?.Where(p =&gt; px == 2 &amp;&amp; py == 3) ?? someDefault;` 如果您的列表为空,将返回合适的默认值 (2认同)