我正在将一个列表转换为另一个列表.除了第一个列表中的数据,我想要添加位置.为此,我创建了以下代码:
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?
你不需要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依赖于一个可变变量,你就放弃了这个非常重要的属性.
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |