为什么不能更新 IEnumerable<> 中元素的属性?
Why can't the properties of elements within an IEnumerable<> be updated?
我看到了这个解释无法完成的答案,但我想知道为什么。
Updating an item property within IEnumerable but the property doesn't stay set?
以这段代码为例:
var MyClasses = new[] { 1, 2, 3, 4 }.Select(id => new MyClass { Id = id });
MyClass BobClass = MyClasses.FirstOrDefault(_mc => _mc.Id == 3);
BobClass.FirstName = "Bob";
Console.WriteLine("Id: {0}, FirstName: {1}", BobClass.Id, BobClass.FirstName);
foreach (var MyClass in MyClasses)
{
Console.WriteLine("Id: {0}, FirstName: {1}", MyClass.Id, MyClass.FirstName);
}
- 我创建了一个集合。
- 我使用
FirstOrDefault()
从集合中获取 ID == 3 的元素。这使我获得了对集合中元素的引用。
- 我将其 FirstName 属性 设置为 Bob
- 当我遍历列表时,FirstName 仍然为空。
我不明白这是怎么回事。我清楚地得到了对原始对象的引用,但这几乎就像 FirstOrDefault()
给我的只是对象的 copy 而不是引用。我可以更新副本,但它显然不会保留到原始副本,因为它们是两个完全独立的实体。
更新
哇,这很有趣:
BobClass = MyClasses.FirstOrDefault(mc => object.ReferenceEquals(BobClass, mc));
鲍勃returnsnull
...?不得不说...我肯定在这里受阻了。
MyClasses 是一个 IEnumerable。这将在您每次访问它时执行。这本身并不意味着无法更新 类 之一。但是......你每次都创建 MyClass 的新实例。这些显然将具有未初始化的属性。如果你添加 .ToList() 你会得到你期望的行为。
我看到了这个解释无法完成的答案,但我想知道为什么。
Updating an item property within IEnumerable but the property doesn't stay set?
以这段代码为例:
var MyClasses = new[] { 1, 2, 3, 4 }.Select(id => new MyClass { Id = id });
MyClass BobClass = MyClasses.FirstOrDefault(_mc => _mc.Id == 3);
BobClass.FirstName = "Bob";
Console.WriteLine("Id: {0}, FirstName: {1}", BobClass.Id, BobClass.FirstName);
foreach (var MyClass in MyClasses)
{
Console.WriteLine("Id: {0}, FirstName: {1}", MyClass.Id, MyClass.FirstName);
}
- 我创建了一个集合。
- 我使用
FirstOrDefault()
从集合中获取 ID == 3 的元素。这使我获得了对集合中元素的引用。 - 我将其 FirstName 属性 设置为 Bob
- 当我遍历列表时,FirstName 仍然为空。
我不明白这是怎么回事。我清楚地得到了对原始对象的引用,但这几乎就像 FirstOrDefault()
给我的只是对象的 copy 而不是引用。我可以更新副本,但它显然不会保留到原始副本,因为它们是两个完全独立的实体。
更新
哇,这很有趣:
BobClass = MyClasses.FirstOrDefault(mc => object.ReferenceEquals(BobClass, mc));
鲍勃returnsnull
...?不得不说...我肯定在这里受阻了。
MyClasses 是一个 IEnumerable。这将在您每次访问它时执行。这本身并不意味着无法更新 类 之一。但是......你每次都创建 MyClass 的新实例。这些显然将具有未初始化的属性。如果你添加 .ToList() 你会得到你期望的行为。