我遇到了这个解释 无法完成的答案,但我想知道为什么。
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的元素。这让我得到了集合中元素的引用。我不明白这是如何运作的。我清楚地得到了对原始对象的引用,但它几乎就像FirstOrDefault()
给了我一个对象的副本而不是引用。我可以更新副本,但它显然不会保留原文,因为它们是两个完全独立的实体。
更新
哇,这很有趣:BobClass = MyClasses.FirstOrDefault(mc => object.ReferenceEquals(BobClass, mc));
Bob返回null
...?要说......我在这里肯定受到了阻碍。
答案 0 :(得分:1)
MyClasses是一个IEnumerable。每次访问时都会执行此操作。这本身并不能使更新其中一个类。但是......每次都会创建MyClass的新实例。这些显然具有未初始化的属性。如果你添加.ToList(),你将得到你期望的行为。