Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Linq查询分组检查结果是否为空_C#_Linq - Fatal编程技术网

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查询进行求值。然后你可以检查列表是否为空。这很简单!谢谢!:)@欢迎你,伙计。我很高兴我帮了忙。