【问题标题】:How to update an object in a c# HashSet?如何更新 c# HashSet 中的对象?
【发布时间】:2015-11-14 19:58:12
【问题描述】:

我正在尝试使用不同的对象更新 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); 

【问题讨论】:

    标签: c# linq list hashset


    【解决方案1】:

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

    您没有更改 HashSet 参考

    要做你想做的事,你必须把它从哈希集中删除,然后添加新的

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

    或者如果你只想更新名称,你可以这样做

            existingPerson2.Name = person2Updated.Name
    

    【讨论】:

    • 如果您需要创建一个新的引用来更改某些内容但仍与之前的引用具有相同的计算能力,则可以采用这种方式。我希望有一天 HashSet 添加一个在内部更优化的 Replace 方法...
    【解决方案2】:

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

    existingPerson2 = person2Updated;
    

    所做的是改变existingPerson2 指向的内容。它不会改变HashSet 指向的内容。

    【讨论】:

      【解决方案3】:

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

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

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

      existingPerson2.Name = "LisaUpdated";
      

      【讨论】:

        【解决方案4】:

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

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

        person2.Name = "LisaUpdated";
        

        也会影响Hashset中的对象。

        【讨论】:

          猜你喜欢
          • 2023-02-14
          • 2011-11-03
          • 2017-11-18
          • 2015-12-23
          • 2016-05-28
          • 1970-01-01
          • 2014-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多