private IEnumerable<string> Tables
{
get
{
yield return "Foo";
yield return "Bar";
}
}
假设我想要迭代这些并写一些类似于processing #n of #m的东西。
有没有一种方法可以让我在不进行主迭代的情况下求出m的值?
我希望我讲清楚了。
private IEnumerable<string> Tables
{
get
{
yield return "Foo";
yield return "Bar";
}
}
假设我想要迭代这些并写一些类似于processing #n of #m的东西。
有没有一种方法可以让我在不进行主迭代的情况下求出m的值?
我希望我讲清楚了。
当前回答
它可能不会产生最好的性能,但你可以使用LINQ来计算IEnumerable中的元素:
public int GetEnumerableCount(IEnumerable Enumerable)
{
return (from object Item in Enumerable
select Item).Count();
}
其他回答
我认为这是最简单的方法
Enumerable.Count<TSource>(IEnumerable<TSource> source)
参考:system.linq.enumerable
只是增加了一些额外的信息:
Count()扩展并不总是迭代。考虑Linq to Sql,其中计数将进入数据库,但不是返回所有行,而是发出Sql count()命令并返回结果。
此外,编译器(或运行时)足够聪明,如果有对象的Count()方法,它将调用该方法。所以这并不像其他回应者所说的那样,完全无知,总是为了计算元素而迭代。
在许多情况下,程序员只是检查if(可枚举的。Count != 0)使用Any()扩展方法,如if(enumerable.Any())使用linq的惰性求值要有效得多,因为一旦确定有任何元素,它就会短路。它的可读性也更强
我建议你打电话给ToList。是的,您正在提前进行枚举,但您仍然可以访问项目列表。
不,不一般。使用枚举对象的一点是,枚举中的实际对象集是不知道的(预先知道,甚至根本不知道)。
IEnumerable不迭代就不能计数。
在“正常”情况下,实现IEnumerable或IEnumerable<T>的类(如List<T>)可以通过返回List<T>来实现Count方法。数属性。然而,Count方法实际上不是在IEnumerable<T>或IEnumerable接口上定义的方法。(事实上,唯一一个是GetEnumerator。)这意味着不能为它提供特定于类的实现。
相反,Count是一个扩展方法,定义在静态类Enumerable上。这意味着可以在IEnumerable<T>派生类的任何实例上调用它,而不管该类的实现如何。但这也意味着它是在一个单独的地方实现的,在任何这些类的外部。这当然意味着它必须以一种完全独立于这些类内部的方式实现。计数的唯一方法是通过迭代。