gpt4 book ai didi

c# - Enumerable.Count()==n 的替代品

转载 作者:太空宇宙 更新时间:2023-11-03 22:16:41 24 4
gpt4 key购买 nike

我正在为 Enumerable.Count() == n 寻找更好的替代方法。我能想到的最好的是:

static class EnumerableExtensions
{
public static bool CountEquals<T>(this IEnumerable<T> items, int n)
{
if (n <= 0) throw new ArgumentOutOfRangeException("n"); // use Any()

var iCollection = items as System.Collections.ICollection;
if (iCollection != null)
return iCollection.Count == n;

int count = 0;
bool? retval = null;
foreach (var item in items)
{
count++;

if (retval.HasValue)
return false;

if (count == n)
retval = true;
}

if (retval.HasValue)
return retval.Value;

return false;
}
}

class Program
{
static void Main(string[] args)
{
var items0 = new List<int>();
var items1 = new List<int>() { 314 };
var items3 = new List<int>() { 1, 2, 3 };
var items5 = new List<int>() { 1, 2, 3, 4, 5 };
var items10 = Enumerable.Range(0, 10);
var itemsLarge = Enumerable.Range(0, Int32.MaxValue);

Console.WriteLine(items0.CountEquals(3));
Console.WriteLine(items1.CountEquals(3));
Console.WriteLine(items3.CountEquals(3));
Console.WriteLine(items5.CountEquals(3));
Console.WriteLine(itemsLarge.CountEquals(3));
}
}

我可以做得更好吗?有没有一种方法可以进一步概括这一点——传递比较?

最佳答案

您可以结合使用 TakeCount 来完全摆脱循环:

public static bool CountEquals<T>(this IEnumerable<T> items, int n)
{
var iCollection = items as System.Collections.ICollection;
if (iCollection != null)
return iCollection.Count == n;
return items.Take(n + 1).Count() == n;
}

关于c# - Enumerable.Count()==n 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869635/

24 4 0