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);
这样行吗?
如果没有,您还知道其他哪些优雅的解决方案?
是的,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 myList
is null
,Where
不会被评估,并且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)
因此,如果myList
是null
,result
将由 分配someValue
。
您可以检查 中的选项Project Settings > Build > Advanced options > Language version
。
归档时间: |
|
查看次数: |
80 次 |
最近记录: |