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

时间:2014-08-21 08:05:40

标签: c# linq optimization hashset

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

我现在已经用2种方式完成了这项工作,一次使用hashset,一次只使用linq。这些条目的测试没有显示出很大的差异,但我想知道什么方式,因此哪种方法更适合。

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

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

myList = myList.OrderBy(q => q).Distinct().ToList();

Hashset:我正在使用hashset删除所有重复项,然后我正在订购列表

myList = new HashSet<String>(myList).ToList<String>();
myList = myList.OrderBy(q => q).ToList();

就像我说我做的测试两种方法的消耗大致相同,但我仍然想知道一种方法是否比另一种更好,如果是这样的话(代码是高性能部分,我需要得到)每毫秒我就可以了。)

2 个答案:

答案 0 :(得分:2)

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

myList = myList.Distinct().OrderBy(q => q).ToList();

可能略快于:

myList = myList.OrderBy(q => q).Distinct().ToList();

如果有大量重复项。

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

答案 1 :(得分:0)

他们几乎一样。 Distinct也使用Set<T>来消除重复项。我的建议是首先使用Distinct然后对您的项目进行排序。另外,在您的第二个代码中,ToList<String>来电是多余的,您可以OrderBy使用HashSet,然后拨打ToList