如何更新c#HashSet中的对象?

时间:2015-11-14 19:58:12

标签: c# linq list hashset

我正在尝试使用其他对象更新HashSet中的对象。在下面的代码示例中,为什么不更新person2对象?

HashSet<Person> myHash = new HashSet<Person>();

//populate the HashSet with two Person objects
var person1 = new Person() { Id=1, Name = "John", Age = 21};
var person2 = new Person() { Id=2, Name = "Lisa", Age = 25 };    
myHash.Add(person1);
myHash.Add(person2);

var person2Updated = new Person() { Id = 2, Name = "LisaUpdated", Age = 25 };    
var existingPerson2 = myHash.SingleOrDefault(p => p.Id == 2);
existingPerson2 = person2Updated;

//why isn't the following returning person with Name "LisaUpdated"?
//It is actually returning person with Name "Lisa"
var test = myHash.SingleOrDefault(p => p.Id == 2); 

4 个答案:

答案 0 :(得分:3)

参考类型的工作原理。您有person2个对象的两个引用,一个来自HashSet,另一个来自existingPerson2。全部

existingPerson2 = person2Updated;

确实会改变existingPerson2指向的内容。它并没有改变HashSet指向的内容。

答案 1 :(得分:2)

您正在做的是将existingPerson2的引用替换为另一个person2Updated

您没有更改HashSet参考

要做你想做的事,你必须从hashset中删除它然后添加新的

        myHash.Remove(existingPerson2);
        myHash.Add(person2Updated);

或者如果您只想更新名称,可以执行

        existingPerson2.Name = person2Updated.Name

答案 2 :(得分:1)

正如MacinJuraszek所说,你只是改变了现有的Versons2实例指向的内容。如果要更新哈希集,则需要从中删除旧对象并添加新对象:

myHash.Remove(existingPerson2);
myHash.Add(person2updated);

其他选项只是更改现有人员的属性以匹配新值,但您考虑到引用该对象的任何人都会看到相同的更改:

existingPerson2.Name = "LisaUpdated";

答案 3 :(得分:1)

正如Marcin所指出的,集合存储了对其中包含的任何引用类型的引用,而不是它们的副本。

由于原始引用person2和添加到哈希集的第二个对象引用相同的对象,因此对一个对象的引用的任何突变都将反映在所有其他引用中,例如只需申请:

person2.Name = "LisaUpdated";

也会影响Hashset中的对象。