c# - 在 LINQ select 中更改变量

标签 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 的 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/

相关文章:

c# - 领域驱动设计和 Entity Framework 4.1(代码优先)

Linq - 如何查询特定列并返回列表

c# - LINQ 选择表达式 IEnumerable

c# - 如何通过子属性查询 LINQ 中的对象集合?

c# - 在 propertygrid 中使用 datetimepicker 选择时间

c# - 对象的未引用与引用使用

c# - MVCSiteMapProvider 不会使用 Razor 菜单模板

c# - 如何在 MVC .Net Core 的依赖注入(inject)框架中利用完全相同的对象实例

.net - LINQ语法采用除第一行以外的所有行?

c# - 将sql转换为linq