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


86

存储忽略任何重复项的字符串列表的最有效方法是什么?我以为字典最好通过写dict [str] = false来插入字符串。并通过按键列举一个列表。那是一个好的解决方案吗?

Answers:


111

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

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


5
但是aHashSet将丢失项目的顺序。提供的功能List
aggsol

4
附加:还有SortedSet <T>,这是一个方便的排序HashSet。
WhoIsRich 2015年

还要注意,HashSet不能通过indice访问,只能通过与List相对的枚举器访问。
安德鲁

23

你可以看做这样的事情

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

33
您不需要HashSet的Contains检查。您可以直接调用Add方法,它会根据项目是否已存在而返回true或false。
路加福音

1
应编辑答案,以删除对多余包含的调用。要使上面的示例工作,您需要完成所有这些工作:var collectionWithDup = new [] {“一个”,“一个”,“两个”,“一个”,“两个”,“零”}; var uniqueValues = new HashSet <string>(collectionWithDup);
user3285954

14

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

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

删除项目时,请确保同时将它们都删除。因此,只要您可以确定没有其他东西可以添加到列表中,您将拥有一个按插入顺序排列的唯一集合!



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


2

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

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

它是从以下线程采用的:javascript-数组中的唯一值

测试:

using FluentAssertions;

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

对于性能测试ListHashSetSortedSet。一百万次迭代:

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

测试源代码(要点)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.