将对象作为值插入到集合后重用该对象

本文关键字:对象 集合 插入 | 更新日期: 2023-09-27 18:13:19

我在使用HashTable时遇到了以下问题,但这是一个普遍问题:

假设我有:

  1. 某些类(如Cat),包含某些成员(如公共Age属性)。
  2. 一个包含键(如string)和List<T>值(如List<Cat>)的哈希表。

是否有一种方法可以实例化List<Cat>的单个实例并重用它,以便它以理想的方式产生:

Hashtable catDictionary = new Hashtable();    
Cat cat1 = new Cat() { Age = 10 };
Cat cat2 = new Cat() { Age = 12 };
List<Cat> catList = new List<Cat>();
catList.Add(cat1);
catList.Add(cat2);
catDictionary["oldCat"] = catList;
catList.Clear(); // This undesirably clears the list in HashTable["oldCat"]
Cat cat3 = new Cat() { Age = 2 };
catList.Add(cat3); // Now the list in HashTable["oldCat"] references a young cat!
catDictionary["youngCat"] = catList;

我的意思是,HashTable["oldCat"]内对List<cat>的引用是否可以获得插入的List<Cat>的自己的副本,以便它将与main内引用的副本"分离"?

我想我可以问同样的关于重用Cat对象,但重用List感觉在某种程度上更有用。

将对象作为值插入到集合后重用该对象

你要插入到字典中的列表必须是一个新列表,否则你对主列表所做的任何更改都会影响到字典中的列表(因为它们基本上是同一个实例,只是有两个引用)

我还建议您使用通用字典而不是哈希表

尝试使用LINQ ToList()方法来创建列表的新副本:

Dictionary<string, List<Cat>> catDictionary = new Dictionary<string, List<Cat>>();    
Cat cat1 = new Cat() { Age = 10 };
Cat cat2 = new Cat() { Age = 12 };
List<Cat> catList = new List<Cat>();
catList.Add(cat1);
catList.Add(cat2);
catDictionary["oldCat"] = catList.ToList();
catList.Clear(); 
Cat cat3 = new Cat() { Age = 2 };
catList.Add(cat3); 
catDictionary["youngCat"] = catList.ToList();

你必须重新创建一个列表,否则它将是相同的列表

Hashtable catDictionary = new Hashtable();
Cat cat1 = new Cat() { Age = 10 };
Cat cat2 = new Cat() { Age = 12 };
List<Cat> catList = new List<Cat>();
catList.Add(cat1);
catList.Add(cat2);
catDictionary["oldCat"] = new List<Cat>(catList);
catList.Clear(); // This undesirably clears the list in HashTable["oldCat"]
Cat cat3 = new Cat() { Age = 2 };
catList.Add(cat3); // Now the list in HashTable["oldCat"] references a young cat!
catDictionary["youngCat"] = catList;