如何在C# HashSet中更新对象?

3

我试图使用不同的对象更新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个回答

4
你正在做的是将 existingPerson2 的引用替换为另一个引用,即 person2Updated
你没有改变 HashSet 的引用。
如果想要实现你想要的效果,你必须先从哈希集中删除它,然后再添加新的。
        myHash.Remove(existingPerson2);
        myHash.Add(person2Updated);

如果您只想更新名称,可以执行以下操作:

        existingPerson2.Name = person2Updated.Name

如果您需要创建一个新的引用,它在某些方面发生了变化,但仍然与先前的引用计算结果相等,那么这就是方法。我希望HashSet能够在将来内部更加优化,增加一个Replace方法... - undefined

3
这就是引用类型的工作原理。你有两个对于person2对象的引用,一个来自于你的HashSet,另一个来自于existingPerson2。所有的HTML标签都会保留。
existingPerson2 = person2Updated;

它改变了existingPerson2指向的内容,但不改变HashSet指向的内容。


1

正如MacinJuraszek所说,你只是将其更改为现有的Person2实例所指向的内容。如果你想要更新哈希集合,你需要从中删除旧对象并添加新对象:

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

另一个选项是仅更改现有人员的属性以匹配新值,但您需要考虑到任何引用该对象的人都将看到相同的更改:

existingPerson2.Name = "LisaUpdated";

1
正如Marcin指出的那样,集合存储所包含的任何引用类型的引用,而不是副本。
由于原始引用person2和添加到哈希集中的第二个对象引用相同的对象,对一个对象引用的任何变化都会反映在所有其他引用中,例如只需应用:
person2.Name = "LisaUpdated";

也会影响Hashset中的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接