为什么不能在IEnumerable<>中使用元素的属性?要更新?

时间:2015-11-07 22:18:16

标签: .net reference ienumerable

我遇到了这个解释 无法完成的答案,但我想知道为什么

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()给了我一个对象的副本而不是引用。我可以更新副本,但它显然不会保留原文,因为它们是两个完全独立的实体。

更新

哇,这很有趣:

BobClass = MyClasses.FirstOrDefault(mc => object.ReferenceEquals(BobClass, mc));

Bob返回null ...?要说......我在这里肯定受到了阻碍。

1 个答案:

答案 0 :(得分:1)

MyClasses是一个IEnumerable。每次访问时都会执行此操作。这本身并不能使更新其中一个类。但是......每次都会创建MyClass的新实例。这些显然具有未初始化的属性。如果你添加.ToList(),你将得到你期望的行为。