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

时间:2016-03-28 00:03:52

标签: c# linq visual-studio-2015

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

var anyCategories= categories.Any();

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

var atLeastTwoCategories= categories.Count() > 1;

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

3 个答案:

答案 0 :(得分:9)

最简单的方法是:

Object.keys(HTMLElement.prototype).filter(function(k) { return /^on/.test(k); });

我假设通过'collection'你实际上是指LINQ支持的任何var atLeastTwoCategories= categories.Skip(1).Any(); ,包括SQL数据源。对于IEnumerableList .NET可以将Count优化为O(1)操作,因此它没有任何区别。请参阅https://stackoverflow.com/a/981283/224370,但对于来自数据库的“集合”或迭代元素的成本较高,此方法更快。

答案 1 :(得分:4)

不要使用方法Count(),使用属性Count! (删除括号)

这应该只返回数组的长度而不尝试任何过滤逻辑。

答案 2 :(得分:3)

要实现AtLeast(n)操作,如果集合包含n个或更多项目需要迭代集合n - 1次,则返回true,然后检查是否还有其他项目剩余。或者把它放在代码中:

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();
}

这不需要对集合进行完整的迭代,因此应该合理有效。

您可以尝试通过添加Array<T>List<T>以及您可以想到的更好方式的任何其他类型的特定版本来提高效率。例如:

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