我正在将一个列表转换为另一个列表。 除了来自第一个列表的数据之外,我还想添加位置。为此,我创建了以下代码:
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 的 Select
中更改它的值是否安全?
最佳答案
你不需要pos
. Select
有一个需要 Func<T, int, TResult>
的重载作为参数,而不是 Func<T, TResult>
,其中 int 是元素的索引 T
.
listA.Select(
(a, index) => new B { ..., Position = index}
).ToList();
Is it safe to use such variable like pos in my code and change its value inside LINQ's 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
LINQ 是无状态的。它应该是纯粹的,因为对于相同的输入,您应该总是得到相同的输出。通过使 lambda 依赖于可变变量,您将放弃这个非常重要的属性。
关于c# - 在 LINQ select 中更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24387317/