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

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

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

我希望我讲清楚了。


当前回答

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

其他回答

你也可以这样做:

Tables.ToList<string>().Count;

IEnumerable不迭代就不能计数。

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

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

简化所有答案。

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

如果你有:

IEnumerable < >产品

然后:

声明:"using System.Linq;"

数:

.Count products.ToList ()

LINQ中有一个用于。net 6的新方法 观看https://www.youtube.com/watch?v=sIXKpyhxHR8

Tables.TryGetNonEnumeratedCount(out var count)

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

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