2015-11-14 47 views
1

我试图用不同的对象更新HashSet中的对象。在下面的代码示例中,为什么不更新person2对象?如何更新c#HashSet中的对象?

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); 

回答

3

这就是参考类型的工作方式。您有两个对person2对象的引用,一个来自您的HashSet和一个来自existingPerson2。全部

existingPerson2 = person2Updated; 

确实是改变什么existingPerson2指向。它不会改变什么HashSet指向。

2

你正在做的是更换到另一个是person2Updated

你不改变HashSet参考

做你想做什么existingPerson2参考,你必须从HashSet中删除它,然后添加新的

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

,或者如果你希望只更新名称,你可以做

 existingPerson2.Name = person2Updated.Name 
1

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

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

另一种选择是只是改变了现有的人的属性,以匹配新的价值观,但你考虑到任何引用该对象会看到同样的变化:

existingPerson2.Name = "LisaUpdated"; 
1

由于马辛指出,收藏品店的引用,而不是,其中包含的引用类型的副本。由于原始参考person2和添加到哈希集的第二个对象引用了同一个对象,所以对一个对象的一个​​引用的任何变化都将反映在所有其他引用中,例如,简单地应用:

person2.Name = "LisaUpdated"; 

也会影响Hashset中的对象。