0

如果我写:

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

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

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

4

2 回答 2

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)
{   
}
于 2012-07-19T13:30:13.773 回答
2

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

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

例如:

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

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

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

 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 需要再次执行所有查询。-马克兹

因为您正在创建一个被编译成 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();
    }

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

于 2012-07-19T13:35:12.503 回答