我将一个列表转换为另一个列表。 除了第一个列表中的数据,我想要添加位置。为此,我创建了以下代码:
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
中更改其值是否安全?
答案 0 :(得分:6)
您不需要pos
。 Select
有一个重载,它以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依赖于一个可变变量,你就放弃了这个非常重要的属性。