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

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

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

我希望我讲清楚了。


当前回答

我使用IEnum<string>. toarray <string>()。长度,效果很好。

其他回答

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

它可能不会产生最好的性能,但你可以使用LINQ来计算IEnumerable中的元素:

public int GetEnumerableCount(IEnumerable Enumerable)
{
    return (from object Item in Enumerable
            select Item).Count();
}

IEnumerable不支持这个。这是有意为之。IEnumerable使用惰性求值在需要元素之前获取它们。

如果你想知道项目的数量而不迭代它们,你可以使用ICollection<T>,它有一个Count属性。

除了你的直接问题(已经得到了否定的回答),如果你想在处理一个可枚举对象时报告进度,你可能想看看我的博客文章《在Linq查询期间报告进度》。

它让你这样做:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += (sender, e) =>
      {
          // pretend we have a collection of 
          // items to process
          var items = 1.To(1000);
          items
              .WithProgressReporting(progress => worker.ReportProgress(progress))
              .ForEach(item => Thread.Sleep(10)); // simulate some real work
      };

我的一个朋友有一系列的博客文章来说明为什么你不能这样做。他创建了一个返回IEnumerable的函数,每次迭代都会返回下一个质数,一直到ulong。MaxValue,下一项直到您请求它时才计算。一个简单的问题:返回了多少项?

以下是一些帖子,但它们有点长:

Beyond Loops(提供一个在其他帖子中使用的初始EnumerableUtility类) 迭代应用(初始实现) 疯狂的扩展方法:ToLazyList(性能优化)