[英]C# Linq Query group by check if result is null
如果我有这样的课程
public class Test
{
public string Id {get; set;}
public string Name {get; set;}
public int Value {get; set;}
}
接着:
List<Test> values = new List<Test>(); // this contains let's say 10 items
我喜欢这个:
var grouped = values.Where(x=>x.Value > 10).GroupBy(x=>x.Name);
我的问题是如何检查grouped == null
? 或者我如何检查没有符合该标准的分组?
我问,因为我喜欢这样:
if (grouped == null) // this is false although the linq yielded no results
{
}
您可以使用方法Any()
:
var anyItems = grouped.Any();
您不需要检查null,因为分组将返回空集合而不是null
您可以检查是否没有组,如下所示:
var anyGroups = grouped.Any();
如果至少有一个组,则名为Any
的扩展方法将返回true
。 否则它将返回false
。
根据MSDN ,这是GroupBy
方法的签名:
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector)
从上面可以清楚地看出,该方法返回实现IGrouping
接口的一系列项。 ( IGrouping
表示具有公共密钥的对象的集合)。 查找序列是否包含元素的简单方法是使用名为Any
的枚举扩展方法。
此外,这是一个O(1)
操作 - 使用Any
方法而不传递任何谓词。 使用名为Count
的枚举扩展方法时,在某些情况下是O(n)
操作。
GroupBy
永远不会返回null
。 当结果中没有记录时,您将获得一个空的IEnumerable<IGrouping<TKey,TSource>>
对象。
在您的情况下, GroupBy
是不必要的:您可以用它替换它
var anyGreaterThanTen = values.Any(x=>x.Value > 10);
使用Any()
就足够了,但它不是最优的解决方案。
您显然需要在找到结果后迭代结果,但在迭代结果之前调用Any()
会导致查询运行两次。 对于像这里一样的简单示例,这不是什么大问题,但如果它是对数据库(LINQ to SQL或Entity Framework)的查询,那么您有两个数据库命中。 一旦检查是否有任何结果,然后在下一步获取结果。
为避免这种情况,您可以写:
bool hasResult = false;
// iterating over the result, and performing your task
foreach(var group in grouped)
{
hasResult = true;
// process data
// ...
}
if(!hasResult)
{
// ...
}
检查结果是否为null时,我遇到同样的问题。 所以,我调试了它。 我发现当结果没有组时,它有时没有元素或1个元素,但是这个元素是null。 因此,要检查结果不为null的位置,我们应该结合以下两个条件:
if(grouped.Count() > 0 && grouped.ElementAt(0) != null)
{
//TODO:....enter code here
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.