【问题标题】:Efficient list of unique strings C#唯一字符串 C# 的有效列表
【发布时间】:2010-10-29 10:59:52
【问题描述】:

存储忽略任何重复的字符串列表的最有效方法是什么? 我在想字典可能最好通过编写 dict[str] = false; 来插入字符串。并以列表的形式枚举键。这是一个好的解决方案吗?

【问题讨论】:

    标签: c# unique-values


    【解决方案1】:

    如果您使用的是 .NET 3.5,HashSet 应该适合您。

    HashSet)>) 类提供 高性能集合操作。一套 是一个集合,不包含 重复元素,以及其元素 没有特别的顺序。

    【讨论】:

    • 但是HashSet 会丢失项目的顺序。 List 提供的功能。
    • 补充:还有SortedSet是一个方便的排序HashSet。
    • 另请注意,HashSet 不能通过索引访问,只能通过与列表相反的枚举器访问。
    【解决方案2】:

    这不是系统命名空间的一部分,但已将来自http://www.codeproject.com/KB/recipes/sets.aspx 的 Iesi.Collections 与 NHibernate 一起使用。它支持散列集以及排序集、字典集等。自从它与 NHibernate 一起使用以来,它已经被广泛使用并且非常稳定。这也不需要 .Net 3.5

    【讨论】:

      【解决方案3】:

      你可以做这样的事情

      var hash = new HashSet<string>();
      var collectionWithDup = new []{"one","one","two","one","two","zero"}; 
      
      // No need to check for duplicates as the Add method
      // will only add it if it doesn't exist already
      foreach (var str in collectionWithDup)
          hash.Add(str);   
      

      【讨论】:

      • 您不需要使用 HashSet 进行包含检查。您可以直接调用 Add 方法,它会根据项目是否已存在返回 true 或 false。
      • 应编辑答案以删除对冗余包含的调用。这就是上述示例运行所需的全部内容: var collectionWithDup = new[] { "one", "one", "two", "one", "two", "zero" }; var uniqueValues = new HashSet(collectionWithDup);
      【解决方案4】:

      我不确定这是否算作一个好的答案,但是当需要一个保持插入顺序的唯一集合时,我使用 HashSet 和 List 并排妥协。在这种情况下,每当您添加到集合中时,请执行以下操作:

      if(hashSet.Add(item))
          orderList.Add(item);
      

      删除项目时,请确保从两者中删除它们。因此,只要您可以确定没有其他任何项目添加到列表中,您就会拥有一个按插入顺序排列的唯一集!

      【讨论】:

        【解决方案5】:

        使用 HashSet,无需检查 .Contains() ,只需将您的项目添加到列表中,如果重复则不会添加它。

           HashSet<int> uniqueList = new HashSet<int>();
           uniqueList.Add(1); // List has values 1
           uniqueList.Add(2);  // List has values 1,2
           uniqueList.Add(1);  // List has values 1,2
           Console.WriteLine(uniqueList.Count); // it will return 2
        

        【讨论】:

          【解决方案6】:

          这是另一个不使用HashSet 的解决方案。

          var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
          var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index);
          

          它是从这个线程中采用的:javascript - Unique values in an array

          测试:

          using FluentAssertions;
          
          uniqueItems.Count().Should().Be(3);
          uniqueItems.Should().BeEquivalentTo("one", "two", "zero");
          

          ListHashSetSortedSet 的性能测试。 100 万次迭代:

          List: 564 ms
          HashSet: 487 ms
          SortedSet: 1932 ms
          

          Test source code (gist)

          【讨论】:

            【解决方案7】:

            你也可以使用 Linq:

            using System.Linq;
            
            var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
            
            List<string> distinctItems = items.Distinct().ToList();
            

            【讨论】:

              猜你喜欢
              • 2012-12-03
              • 1970-01-01
              • 1970-01-01
              • 2021-08-29
              • 2012-11-13
              • 2021-07-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多