有效的唯一string列表C#

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

如果你正在使用.NET 3.5, HashSet应该为你工作。

HashSet <(Of <(T>)>)类提供了高性能的集合操作。 集合是不包含重复元素的集合,其元素没有特定的顺序。

你可以看看做这样的事情

 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和一个List并列的方式。 在这种情况下,无论何时添加到集合中,请执行以下操作:

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

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

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

这不是系统命名空间的一部分,但是使用了NHibernate的http://www.codeproject.com/KB/recipes/sets.aspx中的Iesi.Collections。; 它支持散列集以及sorting集,字典集等等。 既然已经和NHibernate一起使用,它已被广泛使用,非常稳定。 这也不需要.NET 3.5

这里是另一个不使用HashSet解决scheme。

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

它是从这个线程采用: javascript – 数组中的唯一值

testing:

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

性能testingListHashSetSortedSet 。 100万次迭代:

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

testing源代码(gist)

Interesting Posts