什么是从列表中获取所有不同项的最快/最有效的方法?
我有一个List<string>
,其中可能有多个重复项,我只想得到列表中的唯一值。
yourList.Distinct().ToList()
会对可枚举对象进行两次完整迭代,并且还要基于 IEqualityComparer
,比 GetHashCode
更慢。 - Noldorin使用HashSet<T>
。例如:
var items = "A B A D A C".Split(' ');
var unique_items = new HashSet<string>(items);
foreach (string s in unique_items)
Console.WriteLine(s);
打印
A B D C
HashSet
不会维护任何顺序,这可能与原帖作者的需求有关系也可能无关。 - LukeHpublic IEnumerable<T> Distinct<T>(IEnumerable<T> source)
{
List<T> uniques = new List<T>();
foreach (T item in source)
{
if (!uniques.Contains(item)) uniques.Add(item);
}
return uniques;
}
HashSet<T>
对象来初始化您的集合。这很可能比LINQ更有效,因为它使用哈希码(GetHashCode
)而不是IEqualityComparer
。实际上,如果适用于您的情况,我会直接使用HashSet
来存储项目。HashSet
不会维护任何顺序,这可能对 OP 有影响也可能没有。 - LukeHDistinct
应该/确实按顺序迭代列表(尽管我不确定这是否在任何规范中都得到了保证)。 - LukeHHashSet
就是正确的选择。 - Noldorin
["A", "B", "C", "C", "D", "D"]
列表,独特的项目将返回["A","B"]
,而不同的项目将返回["A", "B", "C", "D"]
。 - Eduardo Pignatelli