【问题标题】:Why can't the properties of elements within an IEnumerable<> be updated?为什么不能更新 IEnumerable<> 中元素的属性?
【发布时间】:2015-11-07 22:18:16
【问题描述】:

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

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...?不得不说...我肯定在这里受阻。

【问题讨论】:

    标签: .net reference ienumerable


    【解决方案1】:

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

    【讨论】:

    • DUH... 在迭代器启动之前它们不会被实例化,所以我每次开始使用迭代器时都会创建新对象。谢谢。
    • 当您开始将 lambdas 视为匿名代表时,这是有道理的。 new MyClass() 表达式存在于尚未被调用的委托中,因此当调用委托时,它将在每次迭代时执行 new MyClass()
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多