使用LINQ在列表中检查空值

3

我有一个列表List<OfferComparison> Comparison,我想在if条件语句中检查所有项是否具有Value == null

我该如何使用linq实现呢?

public class OfferComparison : BaseModel
{
    public string Name { get; set; }
    public string Value { get; set; }
    public bool Valid { get; set; }
}

2
值得收藏 - https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b - jdphenix
3个回答

19

更新(C# 7之后)的回答

如果使用C# 7或8,则可以将is关键字与Linq.All一起使用:

var result = Comparison.All(item => item.Value is null)
如果使用C# 9,则可以将“is not null”与“Linq.Any”结合使用:
var result = Comparison.Any(item => item.Value is not null)
如果使用 C# 9,就可以结合 Linq.Any 使用 is objectis {}
var result = Comparison.Any(item => item.Value is object)

所有这些选项在某种程度上都是等效的。至少在时间复杂度方面,它们都是O(n)。我想“首选”选项只取决于个人观点。


原始(C# 7之前)答案

使用All的linq方法:

var result = Comparison.All(item => item.Value == null)

基本上它所做的就是迭代集合中的所有项并为每个项检查一个谓词。如果有一个不匹配 - 结果为false。


基本上它所做的就是迭代集合中的所有项并为每个项检查一个谓词。如果有一个不匹配 - 结果为false。

4
您可以通过此LINQ语句进行检查。
var isNull = Comparison.All(item => item.Value == null);

1

我不完全确定AllExists的内部区别,但检查其中一个条目是否为空然后取反结果可能是个好主意:

var result = !Comparison.Exists(o => o.Value != null);

我期望这个查询在找到第一个非空值后就停止,因此更加高效。
更新:从 Enumerable.All 文档中得知:
枚举源的过程会在结果可以确定时立即停止。
因此,在找到非空值后使用 All 可能不会导致整个列表被处理。
因此,前面提到的可能的性能提升不太可能发生,两种解决方案可能没有区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接