如何更新 C# HashSet 中的对象?
How to update an object in a c# 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);
这就是引用类型的工作原理。您有两个对 person2
对象的引用,一个来自您的 HashSet
,一个来自 existingPerson2
。全部
existingPerson2 = person2Updated;
所做的是改变 existingPerson2
指向的内容。它不会改变 HashSet
指向的内容。
您正在做的是将 existingPerson2
的引用替换为另一个 person2Updated
您没有更改 HashSet
参考资料
要执行您想要的操作,您必须将其从哈希集中删除,然后添加新的
myHash.Remove(existingPerson2);
myHash.Add(person2Updated);
或者如果您只想更新名称,您可以
existingPerson2.Name = person2Updated.Name
正如 MacinJuraszek 所说,您只是更改了 existingPerson2 实例所指向的内容。如果你想更新哈希集,你需要从中删除旧对象并添加新对象:
myHash.Remove(existingPerson2);
myHash.Add(person2updated);
其他选项只是更改现有人员的属性以匹配新值,但您要考虑到引用该对象的任何人都会看到相同的更改:
existingPerson2.Name = "LisaUpdated";
正如 Marcin 指出的那样,集合存储对其中包含的任何引用类型的引用,而不是副本。
由于原始引用 person2
和添加到哈希集中的第二个对象引用同一个对象,因此对对象的一个引用的任何更改都将反映在所有其他引用中,例如只需申请:
person2.Name = "LisaUpdated";
也会影响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);
这就是引用类型的工作原理。您有两个对 person2
对象的引用,一个来自您的 HashSet
,一个来自 existingPerson2
。全部
existingPerson2 = person2Updated;
所做的是改变 existingPerson2
指向的内容。它不会改变 HashSet
指向的内容。
您正在做的是将 existingPerson2
的引用替换为另一个 person2Updated
您没有更改 HashSet
参考资料
要执行您想要的操作,您必须将其从哈希集中删除,然后添加新的
myHash.Remove(existingPerson2);
myHash.Add(person2Updated);
或者如果您只想更新名称,您可以
existingPerson2.Name = person2Updated.Name
正如 MacinJuraszek 所说,您只是更改了 existingPerson2 实例所指向的内容。如果你想更新哈希集,你需要从中删除旧对象并添加新对象:
myHash.Remove(existingPerson2);
myHash.Add(person2updated);
其他选项只是更改现有人员的属性以匹配新值,但您要考虑到引用该对象的任何人都会看到相同的更改:
existingPerson2.Name = "LisaUpdated";
正如 Marcin 指出的那样,集合存储对其中包含的任何引用类型的引用,而不是副本。
由于原始引用 person2
和添加到哈希集中的第二个对象引用同一个对象,因此对对象的一个引用的任何更改都将反映在所有其他引用中,例如只需申请:
person2.Name = "LisaUpdated";
也会影响Hashset中的对象。