在LINQ选择中更改变量

时间:2014-06-24 13:00:09

标签: c# linq

我将一个列表转换为另一个列表。 除了第一个列表中的数据,我想要添加位置。为此,我创建了以下代码:

class A
{
    ...
}

class B
{
    ...
    public int Position { get; set; }
}

List<A> listA = ...;
int pos = 1;
List<B> listB = listA.Where(...).Take(...).Select(
    a => new B { ..., Position = pos++ }).ToList();

这是有效的,但它应该并且它会一直有效吗? 在我的代码中使用像pos之类的变量并在LINQ&#39; s Select中更改其值是否安全?

1 个答案:

答案 0 :(得分:6)

您不需要posSelect有一个重载,它以Func<T, int, TResult>为参数,而不是Func<T, TResult>,其中int是元素T的索引。

listA.Select(
               (a, index) => new B { ..., Position = index}
            ).ToList();

  

在我的代码中使用像pos这样的变量并在LINQ&#39; s中更改其值是否安全

在具体案例中,它是安全的,主要是因为您立即实现了列表(使用ToList)。

一般来说,我建议不要这样做。这就是原因:

var collection = listA.Where(...).Take(...).Select(
    a => new B { ..., Position = pos++ });

foreach(var item in collection)
    Console.WriteLine(item.Position); //prints 0,1,2

foreach(var item in collection)
    Console.WriteLine(item.Position); //prints 3,4,5

LINQ是无国籍的。它应该是,因为对于相同的输入,你应该总是获得相同的输出。通过使lambda依赖于一个可变变量,你就放弃了这个非常重要的属性。