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