如果我写道:
for (int i = 0; i < Strutture.Count(); i++)
{
}
和Strutture是一个包含200个元素的IEnumerable,IIS崩溃。那是因为我看到每次执行Strutture.Count()
它都会执行与该IEnumerable链接的所有LINQ查询。
那么,我怎样才能获得“当前”数量的元素?我需要一份清单?
答案 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();
}
这就是为什么我建议存储上面的查询结果!