假设我有一个包含重复值的List,我想删除重复项.
List<int> myList = new List<int>(Enumerable.Range(0, 10000));
// adding a few duplicates here
myList.Add(1);
myList.Add(2);
myList.Add(3);
Run Code Online (Sandbox Code Playgroud)
我找到了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
Run Code Online (Sandbox Code Playgroud)
在SO的大多数答案中,Distinct方法显示为"正确的",但HashSet总是更快!
我的问题:当我使用HashSet方法时,有什么我必须要注意的,还有另一种更有效的方法吗?
我想知道我是否可以就哪种方法创建一组不同的元素更好的方法达成共识:a C# HashSet或using IEnumerable's .Distinct(),这是Linq函数?
假设我正在使用DataReader循环查询数据库中的查询结果,我的选项是将我构造的对象添加到a List<SomeObject>或者HashSet<SomeObject>使用该List选项,我最终必须执行以下操作:
myList = myList.Distinct().ToList<SomeObject>();
有了这个HashSet,我的理解是,假设你已经覆盖了SomeObject中的GetHashCode()and和Equals()方法,那么添加元素就可以自己处理非重复.我主要关注选项的风险和性能方面.
谢谢.