假设您有两个列表,List1
和List2
。
要将值从复制List2
到List1
,我必须这样做:
List1 = List2.ToList();
否则,List1
将成为List2
并且始终具有相同的值。
但是,将两个列表都更改为HashSet之后,相同的代码将出现以下错误:
Cannot convert source type 'System.Collections.Generic.List<int>' to target type 'System.Collections.Generic.HashSet<int>'
删除.ToList()
作品,但不会导致HashSet2
成为HashSet1
参考,所以HashSet1
总是具有相同的值,而不是一次复制吗?
这不会将值从一个列表复制到另一个列表:
List1 = List2.ToList();
它使用List2并从中创建一个新列表,然后将新列表分配给引用List1。简要地说,您的内存中有3个列表(您的List1,List2和通过在List2上调用ToList()创建的新列表),而不是2。在操作结束时,您以前在List1中拥有的所有内容都会丢失。
List1 = new List<string> { "list1" };
List2 = new List<string> { "list2" };
List1 = List2.ToList(); //List1 now has an item "list2"
List1.Add("list1new");
List2.Add("list2new");
现在,列表如下所示:
List1: "list2", "list1new"
List2: "list2", "list2new"
如果要将项目从List2复制到List1,则可以:
List1.AddRange(List2);
这将使您的列表看起来像(使用上面的其他代码行):
List1: "list1", "list2", "list1new"
List2: "list2", "list2new"
它不适用于HashSet,因为HashSet和List是不同的东西。您不能再说了:
HashSet1 = HashSet2.ToList();
比你可以说:
HashSet1 = new List<string>();
如果您有两个哈希集,并且想要将所有内容放入一个哈希集中,则可以将其放入另一个哈希集中:
Hash2.ToList().ForEach(x => Hash1.Add(x));
这使用LINQ将Hash2转换为列表,然后使用List.ForEach,它将在列表中的每个项目上调用一个方法,因此实质上遍历列表和每个列表项x,在Hash1上调用Add(x)。
HashSet还具有以下功能:
Hash1.UnionWith(Hash2);
在这两个操作中的任何一个结束时,Hash1都将包含其之前所做的所有操作,以及来自Hash2的所有尚不存在的内容。您应注意,实际数据项本身并未克隆,因此,如果将其作为“ Hash”(例如“人”)的哈希,则可以有两个哈希集,每个哈希集都引用约翰·史密斯,但如果要通过一个哈希集来更改他的名字,则另一个哈希集也将显示更改,因为即使有两个HashSet,内存中也只有一个John Smith对象
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句