如何有效地确定IEnumerable是否包含多个元素?

Sam*_*Sam 40 c# linq vb.net

鉴于已初步化IEnumerable:

IEnumerable<T> enumerable;
Run Code Online (Sandbox Code Playgroud)

我想确定它是否有多个元素.我认为最明显的做法是:

enumerable.Count() > 1
Run Code Online (Sandbox Code Playgroud)

但是,我相信Count()列举了整个集合,这对于这个用例来说是不必要的.例如,如果集合包含大量元素或从外部源提供其数据,则在性能方面可能非常浪费.

如果不枚举超过2个元素,我怎么能这样做呢?

Cam*_*n S 50

您可以通过组合System.Linq中的扩展方法以多种方式对此进行测试...下面是两个简单的示例:

bool twoOrMore = enumerable.Skip(1).Any();
bool twoOrMoreOther = enumerable.Take(2).Count() == 2;
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一个,因为一种常见的方法来检查是否Count() >= 1Any(),因此我觉得它更具可读性.

  • 这并不总是有效,如果这是一个数据流,您丢失了您跳过和/或拍摄的数据.此外,如果每次对可枚举操作时数据都在变化,这意味着在完成此测试后,您对数据的评估可能会有所不同. (4认同)
  • @devshorts但他只关心计数,而不是实际数据. (2认同)
  • @devshorts 是的。当然,如有必要,您可以将 Take(2) 结果保存到变量中,但这不是问题中的要求。 (2认同)

And*_*sky 5

为了它的乐趣,调用Next()两次,然后获得另一个IEnumerable.

或者,为此特定目标编写一个小包装类:EnumerablePrefetcher : IEnumerable<T>尝试在初始化时获取指定数量的项目.

它的IEnumerable<T> GetItems()方法应该以这种方式使用yield return

foreach (T item in prefetchedItems) // array of T, prefetched and decided if IEnumerable has at least n elements
{
  yield return item;
}
foreach (T item in otherItems) // IEnumerable<T>
{
  yield return item;
}
Run Code Online (Sandbox Code Playgroud)

  • 代码示例可以表示为`return prefetchedItems.Concat(otherItems);`虽然上面也是实体. (2认同)