存储忽略任何重复项的字符串列表的最有效方法是什么? 我在想字典可能是最好通过编写dict [str] = false来插入字符串;并通过键枚举列表。这是一个很好的解决方案吗?
答案 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");
,List
和HashSet
的效果测试。 100万次迭代:
SortedSet