高效的唯一字符串列表C#

时间:2009-05-28 01:13:55

标签: c# unique-values

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

7 个答案:

答案 0 :(得分:102)

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

  

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

答案 1 :(得分:20)

你可以做这样的事情

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);   

答案 2 :(得分:14)

我不确定这是否算作一个好的答案,但是当面对需要一个维护插入顺序的唯一集时,我并没有与HashSet和List并排。在这种情况下,无论何时添加到集合,请执行以下操作:

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

删除项目时,请务必将其从两者中删除。因此,只要您确定没有其他任何项目添加到列表中,您将拥有一个插入排序的唯一集合!

答案 3 :(得分:8)

使用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

答案 4 :(得分:6)

您也可以使用Linq:

using System.Linq;

var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };

List<string> distinctItems = items.Distinct().ToList();

答案 5 :(得分:2)

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

答案 6 :(得分:2)

这是另一种不使用HostKeyAlgorithms的解决方案。

HashSet

从这个帖子中采用:javascript - Unique values in an array

测试:

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

using FluentAssertions; uniqueItems.Count().Should().Be(3); uniqueItems.Should().BeEquivalentTo("one", "two", "zero"); ListHashSet的效果测试。 100万次迭代:

SortedSet

Test source code (gist)