从字符串列表中获取不同且有序的成员 - linq 或 hashset 以获得唯一的哪个更快/更适合

Tho*_*mas 5 c# linq optimization hashset

我有一个很大的字符串列表(大约 5k-20k 个条目),我需要订购并从中删除重复项。

我现在以两种方式完成此操作,一次使用哈希集,一次仅使用 linq。使用该数量的条目进行测试并没有显示出很大的差异,但我想知道哪种方式以及哪种方法更适合。

对于方式(myList 是数据类型 List):

Linq:我使用 1 条 linq 语句对列表进行排序并从中获取不同的值。

myList = myList.OrderBy(q => q).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

Hashset:我使用 hashset 删除所有重复项,然后我对列表进行排序

myList = new HashSet<String>(myList).ToList<String>();
myList = myList.OrderBy(q => q).ToList();
Run Code Online (Sandbox Code Playgroud)

就像我说的,我所做的测试对这两种方法的时间消耗大致相同,但我仍然想知道一种方法是否比另一种方法更好,如果是这样,为什么(代码用于高性能部分,我需要获得每毫秒我可以出它)。

Joe*_*Joe 5

如果你真的关心每一纳秒,那么

myList = myList.Distinct().OrderBy(q => q).ToList();
Run Code Online (Sandbox Code Playgroud)

可能略快于:

myList = myList.OrderBy(q => q).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

如果有大量重复。

LINQ 方法更具可读性,并且具有与HashSet<T>其他人所说的显式创建 a 相似的性能。事实上,如果原始 List 已经排序,它可能会稍微快一点,因为 LINQ 方法将在排序之前保留初始顺序,而显式创建 aHashSet<T>将以未定义的顺序枚举。


Sel*_*enç 0

它们几乎是一样的。Distinct还使用 aSet<T>来消除重复项。我的建议是先使用Distinct第一个,然后对您的物品进行排序。另外,在您的第二个代码中,ToList<String>call 是多余的,您可以使用OrderByon HashSetthen call ToList