什么是让LINQ一次处理所有集合的最简单方法?

时间:2010-11-16 00:31:07

标签: 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调用之后我必须声明新的变量:var t2 = t.ToList();

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

您可以在不制作单独变量的情况下致电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 :(得分:1)

我通常会调用这些函数,因此看起来像这样:

var t = Enumerable.Range(0,5).Select(x => num(x))。ToList();

答案 2 :(得分:1)

...

var count = 0
foreach(var item in t)
{
   Console.WriteLine(item)
   count++;
}

num现在每个项目评估一次。如果你想使用谓词重载(Count(i => i.PropA ==“abc”)),那么只需将增量包装在if中。不要使用扩展方法;就像你意识到的那样,仅仅是因为你看不到实施并不意味着它还没有让你付出代价。

如果您希望使用具体的值,那么ToList()就是一个很好的答案。