我怎样才能得到"实际" IEnumerable中元素的数量?

时间:2012-07-19 13:27:34

标签: linq ienumerable

如果我写道:

for (int i = 0; i < Strutture.Count(); i++)
{
}

和Strutture是一个包含200个元素的IEnumerable,IIS崩溃。那是因为我看到每次执行Strutture.Count()它都会执行与该IEnumerable链接的所有LINQ查询。

那么,我怎样才能获得“当前”数量的元素?我需要一份清单?

2 个答案:

答案 0 :(得分:2)

实现号码:

int number = Strutture.Count();
for (int i = 0; i < number; i++)
{
}

具体化列表:

var list = Strutture.ToList();
for (int i = 0; i < list.Count; i++)
{
}

或使用foreach

foreach(var item in Strutture)
{   
}

答案 1 :(得分:2)

“那是因为我看到每次执行Strutture.Count()时都会执行与该IEnumerable链接的所有LINQ查询。”

如果不这样做,怎么知道有多少元素?

例如:

Enumerable.Range(0,1000).Where(i => i % 2==0).Skip(100).Take(5).Count();

如果不执行LINQ,你怎么知道有多少元素?

如果你想知道源中有多少元素(例如Enumerable.Range),那么我建议你使用对该源的引用并直接查询它。 E.g。

 var numbers = Enumerable.Range(0,1000);
 numbers.Count();

另外请记住,有些数据源实际上没有“计数”的概念,或者如果它们这样做,则涉及遍历每一项并计算它们。

最后,如果您重复使用.Count()[并且您不希望该值实际更改],那么缓存是个好主意:

 var count = numbers.Count();
 for (int i =0; i<count; i++) //  Do Something

补充:

“首先是Count(),执行LINQ查询。然后,它只是”检查“值:)不”再次执行LINQ查询......“:)” - Markzzz < /强>

那我们为什么不这样做?

var query = Enumerable.Range(0,1000).Where(i => i % 2==0).Skip(100).Take(5).Count();
var result = query.ToArray() //Gets and stores the result!
result.Length;   

:)

“但是当我做第一次”计数“时,它应该存储(在LINQ查询之后)新的IEnumerable(状态被更改)。如果我再次执行.Count(),为什么LINQ需要再次执行所有查询“。 - Markzzz

因为你正在创建一个查询,它被编译成X,Y,Z。您运行相同的查询两次,但结果可能会有所不同。

例如,请查看:

    static void Main(string[] args)
    {
        var dataSource = Enumerable.Range(0, 100).ToList();
        var query = dataSource.Where(i => i % 2 == 0);

        //Run the query once and return the count:
        Console.WriteLine(query.Count());  //50

        //Now lets modify the datasource - remembering this could be a table in a db etc.
        dataSource.AddRange(Enumerable.Range(100, 100));

        //Run the query again and return the count:
        Console.WriteLine(query.Count());  //100
        Console.ReadLine();
    }

这就是为什么我建议存储上面的查询结果!