【问题标题】:LINQ results when there are no matches?没有匹配项时的LINQ结果?
【发布时间】:2010-12-04 17:24:58
【问题描述】:

当没有匹配项时,LINQ 函数究竟返回什么?以Where方法为例:

var numbers = Enumerable.Range(1, 10);
var results = numbers.Where(n => n == 50);

此时会产生什么结果?

【问题讨论】:

  • “结果”中的内容是代表查询的对象。请记住:查询对象不是查询的结果。查询对象是您可以迭代以获得查询结果的东西,它本身并不是结果。

标签: c# linq where-clause


【解决方案1】:

results 本身只是一个查询。在您开始迭代它(显式地或通过像Count() 这样的调用)之前,没有任何东西检查是否有任何结果。只有当你枚举它时,才会发生任何事情。

所以你可以这样做:

foreach (int x in results)
{
    Console.WriteLine("This won't happen");
}

或者:

Console.WriteLine(results.Any()); // Will print false
Console.WriteLine(results.Count()); // Will print 0

任何这些都会导致谓词针对范围内的每个项目进行评估......但在此之前,它根本不会被调用。

这是需要理解的重要一点,因为这意味着results 不可能在保留惰性求值功能的同时成为null - 直到您尝试使用 em> results,不知道是不是null

【讨论】:

  • 我完全忘记了懒惰的评估。 自我打击
  • 请注意,您所说的“查询”实际上是某种 IEnumerable,实际上并没有填充它的数据...
【解决方案2】:

对空的IEnumerable<T> 的引用。

【讨论】:

  • 太棒了!这就是我一直在寻找的。我想确保不必检查 null。
  • Nitpick:对空 IEnumerable 的引用 - 不是集合
  • @Mark 是的,我想澄清一下。
【解决方案3】:

在这种情况下,它返回一个计数为 0 的 IEnumerable<Int32>

【讨论】:

  • 这听起来像是“知道”有一个计数为 0 - 它不知道。返回值是一个IEnumerable<Int32>,它在迭代时将产生 0 个项目。但它事先并不知道 - 它必须针对每个值尝试谓词才能找出答案,并且在您要求之前它不会这样做。
  • @Jon:当然,感谢您的澄清。正如您在帖子中提到的,它必须用于确定结果。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多