【发布时间】:2010-10-29 10:59:52
【问题描述】:
存储忽略任何重复的字符串列表的最有效方法是什么? 我在想字典可能最好通过编写 dict[str] = false; 来插入字符串。并以列表的形式枚举键。这是一个好的解决方案吗?
【问题讨论】:
标签: c# unique-values
存储忽略任何重复的字符串列表的最有效方法是什么? 我在想字典可能最好通过编写 dict[str] = false; 来插入字符串。并以列表的形式枚举键。这是一个好的解决方案吗?
【问题讨论】:
标签: c# unique-values
如果您使用的是 .NET 3.5,HashSet 应该适合您。
HashSet)>) 类提供 高性能集合操作。一套 是一个集合,不包含 重复元素,以及其元素 没有特别的顺序。
【讨论】:
HashSet 会丢失项目的顺序。 List 提供的功能。
这不是系统命名空间的一部分,但已将来自http://www.codeproject.com/KB/recipes/sets.aspx 的 Iesi.Collections 与 NHibernate 一起使用。它支持散列集以及排序集、字典集等。自从它与 NHibernate 一起使用以来,它已经被广泛使用并且非常稳定。这也不需要 .Net 3.5
【讨论】:
你可以做这样的事情
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
【讨论】:
这是另一个不使用HashSet 的解决方案。
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index);
它是从这个线程中采用的:javascript - Unique values in an array
测试:
using FluentAssertions;
uniqueItems.Count().Should().Be(3);
uniqueItems.Should().BeEquivalentTo("one", "two", "zero");
List、HashSet 和 SortedSet 的性能测试。 100 万次迭代:
List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms
【讨论】:
你也可以使用 Linq:
using System.Linq;
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
List<string> distinctItems = items.Distinct().ToList();
【讨论】: