我知道Linq提供了确定集合是否包含任何项目的功能。如
var anyCategories= categories.Any();
这非常有效,因为如果它找到至少一个项目,那么迭代就会停止。现在如果我想知道一个集合是否至少有2个项目怎么办?这是我目前的代码:
var atLeastTwoCategories= categories.Count() > 1;
如果计数大于1,那么这个将经历整个集合。我认为这是非常低效的。 Linq或.NET是否提供了更好的方法?
答案 0 :(得分:9)
最简单的方法是:
Object.keys(HTMLElement.prototype).filter(function(k) { return /^on/.test(k); });
我假设通过'collection'你实际上是指LINQ支持的任何var atLeastTwoCategories= categories.Skip(1).Any();
,包括SQL数据源。对于IEnumerable
和List
.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;
}