作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有时我期望有一定范围的项目,需要进行一些验证以确保我在该范围内。最明显的方法是将集合中的项目数与范围进行比较。
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/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!