存储忽略任何重复项的字符串列表的最有效方法是什么?我以为字典最好通过写dict [str] = false来插入字符串。并通过按键列举一个列表。那是一个好的解决方案吗?
存储忽略任何重复项的字符串列表的最有效方法是什么?我以为字典最好通过写dict [str] = false来插入字符串。并通过按键列举一个列表。那是一个好的解决方案吗?
Answers:
如果您使用的是.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);
您还可以按以下方式使用Linq:
using System.Linq;
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
List<string> distinctItems = items.Distinct().ToList();
这不是系统名称空间的一部分,但已将http://www.codeproject.com/KB/recipes/sets.aspx中的Iesi.Collections与NHibernate一起使用。它支持散列集以及排序集,字典集等。由于已与NHibernate一起使用,因此已被广泛使用并且非常稳定。这也不需要.Net 3.5
这是不使用的另一种解决方案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");
对于性能测试List
,HashSet
和SortedSet
。一百万次迭代:
List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms
HashSet
将丢失项目的顺序。提供的功能List
。