C# 让LINQ同时处理所有收集的最简单方法是什么?
我经常有类似的结构:C# 让LINQ同时处理所有收集的最简单方法是什么?,c#,.net,linq,C#,.net,Linq,我经常有类似的结构: var t = from i in Enumerable.Range(0,5) select num(i); Console.WriteLine(t.Count()); foreach (var item in t) Console.WriteLine(item); 在这种情况下,LINQ将为每个元素计算两次num()函数(一个用于Count(),一个用于输出)。所以在这样的LINQ调用之后,我必须声明新的vatiable:var t2=t.To
var t = from i in Enumerable.Range(0,5)
select num(i);
Console.WriteLine(t.Count());
foreach (var item in t)
Console.WriteLine(item);
在这种情况下,LINQ将为每个元素计算两次num()
函数(一个用于Count(),一个用于输出)。所以在这样的LINQ调用之后,我必须声明新的vatiable:var t2=t.ToList()代码>
有更好的方法吗?我通常调用函数,使其看起来像这样:
var t=Enumerable.Range(0,5).Select(x=>num(x)).ToList() 我通常调用函数,使其看起来像这样:
var t=Enumerable.Range(0,5).Select(x=>num(x)).ToList()
num现在每项计算一次。如果您想使用谓词重载(Count(i=>i.PropA==“abc”)),那么只需将增量包装在If中。不要对所有事情都使用扩展方法;正如您所意识到的,仅仅因为您看不到实现并不意味着它还没有花费您
如果您希望大量使用具体值,那么ToList()是一个很好的答案
num现在每项计算一次。如果您想使用谓词重载(Count(i=>i.PropA==“abc”)),那么只需将增量包装在If中。不要对所有事情都使用扩展方法;正如您所意识到的,仅仅因为您看不到实现并不意味着它还没有花费您
如果您希望大量使用具体的值,那么ToList()是一个很好的答案。您可以调用ToList
,而无需使用单独的变量:
var t = Enumerable.Range(0,5).Select(num).ToList();
编辑:或
var t = Enumerable.Range(0,5).Select(x => num(x)).ToList();
甚至
var t = (from i in Enumerable.Range(0,5)
select num).ToList();
您可以调用ToList
,而无需创建单独的变量:
var t = Enumerable.Range(0,5).Select(num).ToList();
编辑:或
var t = Enumerable.Range(0,5).Select(x => num(x)).ToList();
甚至
var t = (from i in Enumerable.Range(0,5)
select num).ToList();
虚拟-1。这是2个查询!一个用于select,一个用于ToList。@Aliostad:否,ToList()迭代select()的可枚举项,并将每个结果项(计算num()的结果)插入列表中。一个“疑问”。一旦有了这些值,就不再需要计算num()(这显然是不寻常的)。此外,列表上的Count()扩展方法只返回List.Count,而不是枚举整个列表。仍然会发生的是,通过结果集有两次迭代;一个用于将它们放入列表中(该列表首先计算所有num()调用),另一个用于列表中的foreach。问题是如何确保num在范围内的每个项只计算一次,而不是最有效的方法。virtual-1。这是2个查询!一个用于select,一个用于ToList。@Aliostad:否,ToList()迭代select()的可枚举项,并将每个结果项(计算num()的结果)插入列表中。一个“疑问”。一旦有了这些值,就不再需要计算num()(这显然是不寻常的)。此外,列表上的Count()扩展方法只返回List.Count,而不是枚举整个列表。仍然会发生的是,通过结果集有两次迭代;一个用于将它们放入列表(该列表首先计算所有num()调用),另一个用于列表中的foreach。问题是如何确保num在范围内的每个项只计算一次,而不是最有效的方法。@Aliostad:您的答案完全错误。Select
调用不涉及任何列表。我打赌Select中有一个循环。@Aliostad:你错了。没有。如果我不喜欢将查询作为函数来编写呢?@Poma:那么你可以使用任何其他类型的Select
调用。@Aliostad:你的答案完全错了。Select
调用不涉及任何列表。我打赌Select中有一个循环。@Aliostad:你错了。没有。如果我不喜欢将查询编写为函数呢?@Poma:那么您可以使用任何其他类型的Select
调用。