private IEnumerable<string> Tables
{
    get
    {
        yield return "Foo";
        yield return "Bar";
    }
}

假设我想要迭代这些并写一些类似于processing #n of #m的东西。

有没有一种方法可以让我在不进行主迭代的情况下求出m的值?

我希望我讲清楚了。


当前回答

简化所有答案。

IEnumerable没有Count函数或属性。为了得到这个,你可以存储count变量(例如,使用foreach)或使用Linq来获得count。

如果你有:

IEnumerable < >产品

然后:

声明:"using System.Linq;"

数:

.Count products.ToList ()

其他回答

IEnumerable不迭代就不能计数。

在“正常”情况下,实现IEnumerable或IEnumerable<T>的类(如List<T>)可以通过返回List<T>来实现Count方法。数属性。然而,Count方法实际上不是在IEnumerable<T>或IEnumerable接口上定义的方法。(事实上,唯一一个是GetEnumerator。)这意味着不能为它提供特定于类的实现。

相反,Count是一个扩展方法,定义在静态类Enumerable上。这意味着可以在IEnumerable<T>派生类的任何实例上调用它,而不管该类的实现如何。但这也意味着它是在一个单独的地方实现的,在任何这些类的外部。这当然意味着它必须以一种完全独立于这些类内部的方式实现。计数的唯一方法是通过迭代。

IEnumerable<T>上的System.Linq.Enumerable.Count扩展方法有以下实现:

ICollection<T> c = source as ICollection<TSource>;
if (c != null)
    return c.Count;

int result = 0;
using (IEnumerator<T> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
        result++;
}
return result;

因此,它尝试强制转换为具有Count属性的ICollection<T>,并尽可能使用该属性。否则它会迭代。

因此,最好的方法是在IEnumerable<T>对象上使用Count()扩展方法,因为这样可以获得最好的性能。

简化所有答案。

IEnumerable没有Count函数或属性。为了得到这个,你可以存储count变量(例如,使用foreach)或使用Linq来获得count。

如果你有:

IEnumerable < >产品

然后:

声明:"using System.Linq;"

数:

.Count products.ToList ()

不,不一般。使用枚举对象的一点是,枚举中的实际对象集是不知道的(预先知道,甚至根本不知道)。

我在一个方法中使用了这样的方法来检查传入的IEnumberable内容

if( iEnum.Cast<Object>().Count() > 0) 
{

}

在这样的方法中:

GetDataTable(IEnumberable iEnum)
{  
    if (iEnum != null && iEnum.Cast<Object>().Count() > 0) //--- proceed further

}