C#Linq查询分组检查结果是否为空
如果我有这样的课C#Linq查询分组检查结果是否为空,c#,linq,C#,Linq,如果我有这样的课 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 我的问题是如何检查grouped==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
我的问题是如何检查grouped==null
?或者,我如何检查是否没有符合该标准的分组
我这样问是因为如果我真的喜欢这个:
var grouped = values.Where(x=>x.Value > 10).GroupBy(x=>x.Name);
if (grouped == null) // this is false although the linq yielded no results
{
}
您可以使用方法
Any()
:
您不需要检查null,因为分组将返回空集合而不是null
GroupBy
从不返回null
。当结果中没有记录时,您将得到一个空的IEnumerable
对象
在您的情况下,GroupBy
是不必要的:您可以用
var anyGreaterThanTen = values.Any(x=>x.Value > 10);
您可以检查是否没有组,如下所示:
var anyGroups = grouped.Any();
if(grouped.Count() > 0 && grouped.ElementAt(0) != null)
{
//TODO:....enter code here
}
如果至少有一个组,则名为Any
的扩展方法将返回true
。否则它将返回false
根据,这是方法GroupBy
的签名:
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector)
公共静态IEnumerable GroupBy(
这是一个数不清的来源,
Func键选择器)
从上面可以清楚地看到,此方法返回实现i分组
接口的一系列项。(i分组
表示具有公用键的对象集合)。确定序列是否包含元素的一种简单方法是使用名为Any
的可枚举扩展方法
此外,这是一个O(1)
操作-使用Any
方法,并且不在其中传递任何谓词。使用名为Count
的可枚举扩展方法时,在某些情况下是一个O(n)
操作。使用Any()
就足够了,但它不是最佳解决方案
显然,您需要在发现有一些结果之后遍历结果,但是在遍历结果之前调用Any()
,会导致查询运行两次。对于像这里这样的简单示例来说,这并不是什么大问题,但如果是对数据库的查询(LINQ到SQL或实体框架),那么就有两个数据库命中。一次检查是否有任何结果,下一次获取结果
要避免这种情况,您可以编写:
bool hasResult = false;
// iterating over the result, and performing your task
foreach(var group in grouped)
{
hasResult = true;
// process data
// ...
}
if(!hasResult)
{
// ...
}
我在检查结果是否为空时也有同样的问题。我已经调试好了。 我发现,当一个结果没有组时,它有时没有元素或1个元素,但这个元素是空的。因此,要检查结果不为null的位置,我们应结合以下两个条件:
var anyGroups = grouped.Any();
if(grouped.Count() > 0 && grouped.ElementAt(0) != null)
{
//TODO:....enter code here
}
您需要在GroupBy或其他函数之后调用.ToList(),以便对Linq查询进行求值。然后你可以检查列表是否为空。这很简单!谢谢!:)@欢迎你,伙计。我很高兴我帮了忙。