C#Linq通过检查结果是否为null来查询组

use*_*430 4 c# linq

如果我有这样的课程

public class Test
{
   public string Id {get; set;}
   public string Name {get; set;}
   public int Value {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后:

List<Test> values = new List<Test>(); // this contains let's say 10 items
Run Code Online (Sandbox Code Playgroud)

我喜欢这个:

var grouped = values.Where(x=>x.Value > 10).GroupBy(x=>x.Name);
Run Code Online (Sandbox Code Playgroud)

我的问题是如何检查是否grouped == null?或者我如何检查没有符合该标准的分组?

我问,因为我喜欢这样:

if (grouped == null) // this is false although the linq yielded no results
{

}
Run Code Online (Sandbox Code Playgroud)

dot*_*tom 6

你可以使用方法Any():

var anyItems = grouped.Any();
Run Code Online (Sandbox Code Playgroud)

您不需要检查null,因为分组将返回空集合而不是null


Chr*_*tos 5

您可以检查是否没有组,如下所示:

var anyGroups = grouped.Any();
Run Code Online (Sandbox Code Playgroud)

如果至少有一个组,则调用的扩展方法Any将返回true.否则它会返回false.

根据MSDN,这是该方法的签名GroupBy:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector)
Run Code Online (Sandbox Code Playgroud)

从上面可以清楚地看出,该方法返回实现IGrouping接口的一系列项.(IGrouping表示具有公共密钥的对象的集合).查找序列是否包含元素的简单方法是使用枚举的扩展方法调用Any.

此外,这是一个O(1)操作 - 使用该Any方法而不传递任何谓词.在使用枚举的扩展方法时Count,在某些情况下是一个O(n)操作.