C# 从列表中获取唯一项

C# 从列表中获取唯一项,c#,list,unique,C#,List,Unique,从列表中获取所有不同项目的最快/最有效的方法是什么 我有一个列表,其中可能有多个重复项,并且只需要列表中的唯一值。您可以使用该方法返回不同项的IEnumerable: var uniqueItems = yourList.Distinct(); 如果您需要作为列表返回的唯一项序列,您可以添加对以下项的调用: 您可以使用LINQ中的扩展方法,也可以使用。例如: var items = "A B A D A C".Split(' '); var unique_items = new HashSet

从列表中获取所有不同项目的最快/最有效的方法是什么

我有一个
列表
,其中可能有多个重复项,并且只需要列表中的唯一值。

您可以使用该方法返回不同项的
IEnumerable

var uniqueItems = yourList.Distinct();
如果您需要作为
列表返回的唯一项序列,您可以添加对以下项的调用:

您可以使用LINQ中的扩展方法,也可以使用。例如:

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);
var items=“A B A D A C”拆分(“”);
var unique_items=新哈希集(items);
foreach(唯一\u项中的字符串s)
控制台。写入线(s);
印刷品

A B D C A. B D C
除了LINQ的
Distinct
扩展方法之外,您还可以使用一个对象来初始化集合。这很可能比LINQ方法更有效,因为它使用哈希代码(
GetHashCode
)而不是
IEqualityComparer


事实上,如果它适合您的情况,我会首先使用
哈希集来存储项目。

在.Net 2.0中,我非常确定这个解决方案:

public 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;
}
public IEnumerable Distinct(IEnumerable源代码)
{
List uniques=新列表();
foreach(源中的T项)
{
如果(!uniques.Contains(item))uniques.Add(item);
}
返回单号;
}

必须同意;其他人解决了问题,你的解决了原因:)一个
HashSet
不会维护任何订单,这可能是OP的问题,也可能不是OP的问题。谢谢,伙计们,我不需要订购这些物品。这非常有效。
HashSet
不会维护任何排序,这对OP来说可能是问题,也可能不是问题。@Luke:即便如此,调用
Distinct
,排序也没有意义。@Luke:问题是关于最快/最有效的,不需要维护排序。@Noldorin:为什么不
Distinct
应该/确实按顺序迭代列表(尽管我不确定这是否在任何规范中都有保证)。@Luke:哦,我真的在考虑索引。无论如何,OP中提到了效率,而order没有提到(尽管这是一个开放的问题)
HashSet
是一种想要获得良好性能的方法。OP正在寻找一种快速/高效的方法。不是这样。调用
yourList.Distinct().ToList()
需要在可枚举项上进行两次完整的迭代,另外还基于
IEqualityComparer
,这比
GetHashCode
慢。这比HashSet更快/更有效吗?我不这么认为。不过,不必麻烦进行否决表决:-)@Noldorin,@Vinay:如果OP需要作为
列表返回不同的项,那么他们需要调用
ToList
,而不管他们是使用
distinct
还是构造
哈希集。话虽如此,您是对的,在大多数情况下,
哈希集
可能比
Distinct
具有更好的性能。@Noldorin:我知道这很旧,但它很容易在谷歌上出现,您是错的(至少从.NET 4开始-我没有检查旧版本)。yourList.Distinct().ToList()执行一次枚举,new HashSet(yourList)执行两次枚举。HashSet和Distinct的内部Set类的实现几乎相同。它们都使用GetHashCode,它们都使用IEQualityComparer(它们必须使用IEQualityComparer,因为相等的HashCode(通常)不能保证对象相等)。@Noldorin:性能基准如何支持或反对我所说的?您可以通过在Reflector(或其他.NET反编译器)中调出System.Linq.Enumerable.Differenticator和System.Linq.Set来验证我所说的,与相对性能无关。请使用随机访问速度比列表更快的集合,如字典或哈希集。因为目前,如果
source
包含100000个项目和许多重复项,那么在100000次迭代中的每一次迭代中,您将以100000个项目的顺序扫描列表,这意味着您将以
100000*100000
项目的顺序扫描列表。二次时间复杂度可能会变得相当缓慢。这个问题的标题具有误导性。选择唯一项是选择列表中只出现一次的项,而不是选择每个不同的元素一次。给定
[“A”、“B”、“C”、“C”、“D”、“D”]
,唯一的项将返回
[“A”、“B”]
,而不同的项将返回
[“A”、“B”、“C”、“D”]
@EduardoPignatelli相当挑剔,但问题可以毫不含糊地重新表述。通常遇到的这个问题的意思是:“给定一个值列表,如何在不复制任何值的情况下获得这些值的列表?”
public 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;
}