如何更新c#哈希集中的对象?

如何更新c#哈希集中的对象?,c#,linq,list,hashset,C#,Linq,List,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, N

我试图用不同的对象更新哈希集中的对象。在下面的代码示例中,为什么不更新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); 
HashSet myHash=newhashset();
//用两个人对象填充哈希集
var person1=newperson(){Id=1,Name=“John”,Age=21};
var person2=newperson(){Id=2,Name=“Lisa”,年龄=25};
myHash.Add(person1);
myHash.Add(person2);
var person2Updated=newperson(){Id=2,Name=“LisaUpdated”,Age=25};
var existingPerson2=myHash.SingleOrDefault(p=>p.Id==2);
existingPerson2=Person2已更新;
//为什么下面这个名为“LisaUpdated”的返回者没有更新?
//它实际上是返回名为“Lisa”的人
var test=myHash.SingleOrDefault(p=>p.Id==2);

引用类型就是这样工作的。您有两个对
person2
对象的引用,一个来自
HashSet
,另一个来自
existingPerson2
。全部

existingPerson2 = person2Updated;

是否更改现有人员2所指向的内容。它不会改变HashSet所指向的内容。

引用类型就是这样工作的。您有两个对
person2
对象的引用,一个来自
HashSet
,另一个来自
existingPerson2
。全部

existingPerson2 = person2Updated;

是否更改现有人员2所指向的内容。它不会更改
哈希集
指向的内容。

您所做的是将
现有Person2
的引用替换为另一个已更新的
Person2

您没有更改
哈希集
引用

要执行所需操作,必须将其从哈希集中删除,然后添加新的哈希集

        myHash.Remove(existingPerson2);
        myHash.Add(person2Updated);
或者,如果您只想更新名称,您可以这样做

        existingPerson2.Name = person2Updated.Name

您正在做的是将
existingPerson2
的引用替换为另一个已更新的
Person2

您没有更改
哈希集
引用

要执行所需操作,必须将其从哈希集中删除,然后添加新的哈希集

        myHash.Remove(existingPerson2);
        myHash.Add(person2Updated);
或者,如果您只想更新名称,您可以这样做

        existingPerson2.Name = person2Updated.Name

正如MacinJuraszek所说,您正在更改现有Person2实例所指向的内容。如果要更新哈希集,需要从中删除旧对象并添加新对象:

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

existingPerson2.Name = "LisaUpdated";

正如MacinJuraszek所说,您正在更改现有Person2实例所指向的内容。如果要更新哈希集,需要从中删除旧对象并添加新对象:

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

existingPerson2.Name = "LisaUpdated";

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

由于原始引用
person2
和添加到hashset的第二个对象引用同一个对象,因此对一个对象引用的任何变化都将反映在所有其他引用中,例如,仅应用:

person2.Name = "LisaUpdated";

也会影响哈希集中的对象。

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

由于原始引用
person2
和添加到hashset的第二个对象引用同一个对象,因此对一个对象引用的任何变化都将反映在所有其他引用中,例如,仅应用:

person2.Name = "LisaUpdated";
也会影响哈希集中的对象