在LINQ选择中更改变量

Ari*_*Ari 2 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();
Run Code Online (Sandbox Code Playgroud)

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

dca*_*tro 6

你不需要pos.Select有一个重载,它接受一个Func<T, int, TResult>参数,而不是Func<T, TResult>,其中int是元素的索引T.

listA.Select(
               (a, index) => new B { ..., Position = index}
            ).ToList();
Run Code Online (Sandbox Code Playgroud)

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

在您的具体情况下,它是安全的,主要是因为您立即实现了列表(使用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
Run Code Online (Sandbox Code Playgroud)

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