.net HashSet<;T>;和列表<;T>;?
你能解释一下.NET中的.net HashSet<;T>;和列表<;T>;?,.net,list,hashset,difference,.net,List,Hashset,Difference,你能解释一下.NET中的HashSet和List之间的区别吗 也许你可以用一个例子来解释在什么情况下应该首选HashSet而不是List?列表不一定是唯一的,而HashSet就是唯一的。与列表不同 哈希集是一个没有重复成员的列表 因为哈希集被限制为只包含唯一的条目,所以内部结构被优化用于搜索(与列表相比)-它要快得多 如果由于集合中已存在而导致添加失败,则添加到哈希集将返回布尔值-false 可以对集合执行数学集合操作:并集/交集/IsubSeTof等 HashSet不实现IList only
HashSet
和List
之间的区别吗
也许你可以用一个例子来解释在什么情况下应该首选
HashSet
而不是List
?列表不一定是唯一的,而HashSet就是唯一的。与列表不同
//returns a list of distinct items in both sets
HashSet set3 = set1.Union( set2 );
与使用LINQ的等效操作进行比较。书写起来也更整洁 AHashSet
是一个类,旨在为您提供O(1)
查找包含(即,此集合是否包含特定对象,并快速告诉我答案)
List
是一个类,设计用于为您提供一个具有O(1)
随机访问的集合,该集合可以动态增长(想想动态数组)。您可以在O(n)
time中测试包含(除非列表已排序,否则您可以在O(log n)
time中进行二进制搜索)
也许你可以用一个例子来解释在什么情况下应该优先选择HashSet
而不是List
当您想在
O(1)
中测试包含时,列表是类型为T的对象的有序集合,与数组不同,您可以添加和删除条目
您可以使用一个列表,在该列表中,您希望按照存储成员的顺序引用这些成员,并且通过位置而不是项目本身来访问这些成员
HashSet就像一个字典,它的项本身就是键和值,顺序是不确定的
如果要检查对象是否在集合中,可以使用哈希集如果要执行以下操作,请使用列表
:
- 按特定顺序存储项目集合
O(1)
。如果不知道索引,则查找项目需要更多时间,O(n)
对于未排序的集合
要执行以下操作时,请使用Hashset
:
- 快速查明某个对象是否包含在集合中
O(1)
(这是“哈希”部分)。它不像列表那样维护顺序,并且您不能存储重复项(添加重复项无效,这是“设置”部分)
使用哈希集
的一个例子是,如果您想知道在拼字游戏中玩的单词是否是英语(或其他语言)中的有效单词。如果您想构建一个web服务供此类游戏的在线版本的所有实例使用,那就更好了
列表
将是一个很好的数据结构,用于创建记分板以跟踪球员得分。列表是一个有序列表。是的
- 由整数索引访问
- 可以包含重复项
- 有一个可预测的顺序
HashSet是一个集合。它:
- 可以阻止重复项目(请参阅)
- 不保证集合中项目的顺序
- 在集合上具有您期望的操作,例如IntersectWith、IsPropertySubsetof、UnionWith
当您希望访问集合时,列表更合适,因为它就像一个数组,您可以向其中追加、插入和删除项。如果您想将您的集合视为顺序不重要的项目“包”,或者希望使用IntersectWith或UnionWith等操作将其与其他集合进行比较,则HashSet是一个更好的选择。更准确地说,让我们用示例演示
不能像下面的示例中那样使用HashSet
HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
for (int i = 0; i < hashSet1.Count; i++)
Console.WriteLine(hashSet1[i]);
当列表允许您这样做时,您不能将重复项添加到哈希集,并且
在向HashSet添加项时,可以检查它是否包含该项
HashSet<string> hashSet1 = new HashSet<string>(){"1","2","3"};
if (hashSet1.Add("1"))
Console.WriteLine("'1' is successfully added to hashSet1!");
else
Console.WriteLine("'1' could not be added to hashSet1, because it contains '1'");
UnionWith
:
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" };
hashSet1.UnionWith(hashSet2); //hashSet1 -> 3, 2, 4, 6, 8
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
HashSet<string> hashSet2 = new HashSet<string>() { "2", "4", "6", "8" }
hashSet1.IntersectWith(hashSet2);//hashSet1 -> 4, 8
例外于
:
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
hashSet1.ExceptWith(hashSet2);//hashSet1 -> 5, 6
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6
顺便说一下,hashset中不保留顺序。在本例中,我们最后添加了元素“2”,但其顺序为二:
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1"); // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2"); // 3, 2 ,8, 1
HashSet hashSet1=newhashset(){“3”、“4”、“8”};
hashSet1.添加(“1”);//3, 4, 8, 1
hashSet1.删除(“4”);//3, 8, 1
hashSet1.添加(“2”);//3, 2 ,8, 1
如果您决定将这些数据结构应用到数据驱动开发中的实际使用中,则哈希集对于针对数据适配器源测试复制、数据清理和迁移非常有用
此外,如果使用DataAnnotations类,可以在类属性上实现关键逻辑,并使用HashSet有效地控制自然索引(集群索引或非集群索引),这在列表实现中是非常困难的
使用列表的一个强大选项是为视图模型上的多个介质实现泛型,例如为DropDownList助手向MVC视图发送类列表,以及通过WebApi作为JSON构造发送。该列表允许典型的类集合逻辑,并保持灵活性,以更“接口”的方式计算不同介质的单视图模型。有关该主题的一些阅读:我建议您查阅和上的Wikipedia文章。有关性能的相关信息,请参阅列表中的O(log n)除外
HashSet<string> hashSet1 = new HashSet<string>() { "1", "2", "3", "5", "6" };
HashSet<string> hashSet2 = new HashSet<string>() { "1", "2", "3", "4" };
hashSet1.SymmetricExceptWith(hashSet2);//hashSet1 -> 4, 5, 6
HashSet<string> hashSet1 = new HashSet<string>() { "3", "4", "8" };
hashSet1.Add("1"); // 3, 4, 8, 1
hashSet1.Remove("4"); // 3, 8, 1
hashSet1.Add("2"); // 3, 2 ,8, 1