Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让LINQ同时处理所有收集的最简单方法是什么?_C#_.net_Linq - Fatal编程技术网

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
调用。