Ответ 1
Не используйте Count()
, как вы уже знаете, вся коллекция должна быть пройдена в целом.
Вместо этого вы можете сделать это:
public static bool IsWithinRange<T>(this IEnumerable<T> enumerable, int max)
{
return !enumerable.Skip(max).Any();
}
Обратите внимание, что вам все равно придется перечислить первые max
элементы в коллекции, что неизбежно, если вы не попытаетесь сделать некоторые предположения относительно базовой коллекции.
Чтобы действительно оптимизировать это, вы можете проверить, является ли базовый тип ICollection<>
или ICollection
для доступа к свойству Count
. Таким образом, вам не нужно перечислять элементы вообще. В противном случае резерв при перечислении элементов.
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
велико.