更新对象 属性 在可枚举中不起作用

Updating an object property doesn't work in an enumerable

我定义了一个 Order class 如下:

public class Order
{
    public int Id { get; set; }
    public string OrdNumber { get; set; }
}

var dict = new Dictionary<int, string>();
  
dict.Add(1, "ORD1");
dict.Add(2, "ORD2");

var orders = dict.Select(a => new Order { Id = a.Key, OrdNumber = a.Value });

我写了下面的代码来更新 Order 号码:

foreach (var ord in orders)
{
    ord.OrdNumber = ord.OrdNumber + "*";
    Console.WriteLine(ord.OrdNumber);
}

代码按预期执行,输出为:

ORD1*
ORD2*

但是如果我在上面显示的 foreach 之后添加以下 foreach

foreach (var ord in orders)
{
     Console.WriteLine(ord.OrdNumber);
}

结果是:

ORD1
ORD2

完整代码为:

var dict = new Dictionary<int, string>();
dict.Add(1, "ORD1");
dict.Add(2, "ORD2");

var orders = dict.Select(a => new Order { Id = a.Key, OrdNumber = a.Value });

foreach (var ord in orders)
{
   ord.OrdNumber = ord.OrdNumber + "*";
   Console.WriteLine(ord.OrdNumber);
}

foreach (var ord in orders)
{
   Console.WriteLine(ord.OrdNumber);
}

输出为:

ORD1*
ORD2*
ORD1
ORD2

.ToList() 添加到以下行的末尾:

dict.Select(a => new Order { Id = a.Key, OrdNumber = a.Value })

修复了问题。输出现在将是:

ORD1*
ORD2*
ORD1*
ORD2*

谁能解释为什么会这样?

.Select() returns a IEnumerable,这是一个序列播放,在你的情况下,a => new Order { Id = a.Key, OrdNumber = a.Value }

每次 foreach IEnumerable 时,您都会播放该序列。

现在,当添加 .ToList() 时,它 通过创建和保留对象来实现 列表中的序列。当你 foreach 列表时,你不会播放它的创建序列,而是播放它的实际值,这就是为什么在这种情况下 ord.OrdNumber = ord.OrdNumber + "*"; 在使用 List[=21= 时保持不变]