确定集合的有效方法至少有2个项目

Luk*_*101 6 c# linq visual-studio-2015

我知道Linq提供了确定集合是否有任何项目的功能.如

var anyCategories= categories.Any();
Run Code Online (Sandbox Code Playgroud)

这非常有效,因为如果它找到至少一个项目,则迭代停止.现在如果我想知道一个集合是否至少有2个项目怎么办?这是我目前的代码:

var atLeastTwoCategories= categories.Count() > 1;
Run Code Online (Sandbox Code Playgroud)

如果计数大于1,那么这个将经历整个集合.我认为这是非常低效的.Linq或.NET是否提供了更好的方法?

Ian*_*cer 10

最简单的方法是:

var atLeastTwoCategories= categories.Skip(1).Any();
Run Code Online (Sandbox Code Playgroud)

我假设通过'集合'你实际上是指IEnumerableLINQ支持的任何内容,包括SQL数据源.对于ListArray.NET可以优化Count向下到O(1)操作,所以它没有区别.请参阅/sf/answers/68689841/,但对于来自数据库的"集合"或迭代元素的成本较高,此方法更快.


Cor*_*rey 5

要实现AtLeast(n)在集合包含n或更多项目时返回 true的操作,您需要遍历集合n - 1时间,然后检查是否还有剩余项目。或者把它放在代码中:

public static bool AtLeast<T>(this IEnumerable<T> collection, int n)
{
    if (n < 1)
        return true; // or exception, you choose
    if (n == 1)
        return collection.Any();
    return collection.Skip(n - 1).Any();
}
Run Code Online (Sandbox Code Playgroud)

这不需要集合的完整迭代,因此应该是相当有效的。

您可以尝试通过添加特定版本以改善效率Array<T>List<T>以及其他任何类型的,你能想到更好的办法。例如:

public static bool AtLeast<T>(this Array<T> array, int n)
{
    return array.Length >= n;
}
Run Code Online (Sandbox Code Playgroud)