更新对象 属性 在可枚举中不起作用
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= 时保持不变]
我定义了一个 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= 时保持不变]