c# - 检查 IEnumerable 是否少于一定数量的项目而不引起任何不必要的评估?

标签 c# linq

有时我期望有一定范围的项目,需要进行一些验证以确保我在该范围内。最明显的方法是将集合中的项目数与范围进行比较。

public static bool IsWithinRange<T>(this IEnumerable<T> enumerable, int max)
{
    return enumerable.Count() <= max;
}

尽管如此,我的理解是 linq Count() 方法会在返回结果之前评估整个枚举。理想情况下,我只会对最少数量的项目进行评估以获得我的结果。

在不引起任何不必要的评估的情况下确保可枚举项少于特定数量的最佳方法是什么?

最佳答案

不要使用 Count() ,如您所知,通常必须遍历整个集合。

您可以这样做:

public static bool IsWithinRange<T>(this IEnumerable<T> enumerable, int max)
{
    return !enumerable.Skip(max).Any();
}

请注意,您仍然需要枚举第一个 max集合中的项目,这是不可避免的,除非您尝试对基础集合做出一些假设。


要真正进一步优化它,您可以检查基础类型是否为 ICollection<>ICollection为了访问 Count属性(property)。这样你根本不必枚举这些项目。否则回退到枚举项目。

public static bool IsWithinRange<T>(this IEnumerable<T> enumerable, int max)
{
    var asCollection = enumerable as System.Collections.ICollection;
    if (asCollection != null) return asCollection.Count <= max;
    var asGenericCollection = enumerable as ICollection<T>;
    if (asGenericCollection != null) return asGenericCollection.Count <= max;
    return !enumerable.Skip(max).Any();
}

当然,这并不是完全免费的,因为您要进行额外的检查,但如果可能的话,这比必须枚举整个集合要好,尤其是在 max 的情况下。很大。

关于c# - 检查 IEnumerable 是否少于一定数量的项目而不引起任何不必要的评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7591921/

相关文章:

c# - 使用 LINQ 将值一分为二

javascript - Linq JS 连接语法

c# - 尝试学习如何编写使用泛型类型的方法

c# - 错误 CS0433 "Type ' X' already exists in both A.dll and B.dll "来自哪里?

c# - 运算符 '??' 不能应用于类型 'int' 和 'int' 的操作数

c# - 检索三列并按一分组

c# - 如何执行递归搜索?

c# - "Are you sure?"提示。 ViewModel 的一部分还是纯粹的 View ?

c# - 将 java 转换为 c# .net

c# - C++/C# 异常抛出