假设我有一个包含重复值的列表,并且我想要删除这些重复项。
List<int> myList = new List<int>(Enumerable.Range(0, 10000));
// adding a few duplicates here
myList.Add(1);
myList.Add(2);
myList.Add(3);
我已经找到了三种解决方法:
List<int> result1 = new HashSet<int>(myList).ToList(); //3700 ticks
List<int> result2 = myList.Distinct().ToList(); //4700 ticks
List<int> result3 = myList.GroupBy(x => x).Select(grp => grp.First()).ToList(); //18800 ticks
//referring to pinturic's comment:
List<int> result4 = new SortedSet<int>(myList).ToList(); //18000 ticks
在大多数stackoverflow上的答案中,Distinct方法被展示为“正确的方法”,但是HashSet始终更快!
我的问题是:当我使用HashSet方法时,是否有任何需要注意的事项?还有其他更有效的方法吗?
Distinct
使用IEqualityComparer<>
,而HashSet<>
也使用相同的。 - xanatosDistinct()
返回一个无序集合。具体实现保留顺序的事实是巧合的 - 你是否已经检查它在所有的Mono/Unity/Xamarin/XBox CLRs上都能正常工作? - BlueRaja - Danny Pflughoeft