Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HashSet<;T>;和列表<;T>;?_.net_List_Hashset_Difference - Fatal编程技术网

.net HashSet<;T>;和列表<;T>;?

.net HashSet<;T>;和列表<;T>;?,.net,list,hashset,difference,.net,List,Hashset,Difference,你能解释一下.NET中的HashSet和List之间的区别吗 也许你可以用一个例子来解释在什么情况下应该首选HashSet而不是List?列表不一定是唯一的,而HashSet就是唯一的。与列表不同 哈希集是一个没有重复成员的列表 因为哈希集被限制为只包含唯一的条目,所以内部结构被优化用于搜索(与列表相比)-它要快得多 如果由于集合中已存在而导致添加失败,则添加到哈希集将返回布尔值-false 可以对集合执行数学集合操作:并集/交集/IsubSeTof等 HashSet不实现IList only

你能解释一下.NET中的
HashSet
List
之间的区别吗


也许你可以用一个例子来解释在什么情况下应该首选
HashSet
而不是
List

列表不一定是唯一的,而HashSet就是唯一的。

与列表不同

  • 哈希集是一个没有重复成员的列表

  • 因为哈希集被限制为只包含唯一的条目,所以内部结构被优化用于搜索(与列表相比)-它要快得多

  • 如果由于集合中已存在而导致添加失败,则添加到哈希集将返回布尔值-false

  • 可以对集合执行数学集合操作:并集/交集/IsubSeTof等

  • HashSet不实现IList only ICollection

  • 不能将索引与哈希集一起使用,只能使用枚举数

  • 使用HashSet的主要原因是如果您对执行Set操作感兴趣

    给定2组:hashSet1和hashSet2

     //returns a list of distinct items in both sets
     HashSet set3 = set1.Union( set2 );
    
    与使用LINQ的等效操作进行比较。书写起来也更整洁

    A
    HashSet
    是一个类,旨在为您提供
    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