高效的清单订购

时间:2014-03-21 12:29:00

标签: c# performance linq list

我目前正在测试什么是按键值排序列表的最佳算法。

我有一个非常简单的对象(以下代码片段来自C#)

class BasicObject
{
int Key;
}

在构造Object时随机设置Key。

所以我有一个BasicObject对象列表,最后需要按键值排序。

List<BasicObject> basicList = new List<BasicObject>();
for (int i = 0; i < someAmount; i++)
{
basicList.Add(new BasicObject());
}

我的想法是,创建一个名为orderedList左右的新列表,并每次为每个BasicObject循环遍历它,并检查其Key是否高于当前值或更低。 这样的事情:

List<BasicObject> orderedList = new List<BasicObject>();
bool objectWasInserted = false;
orderedList.Add(basicList[0]); // Inserting 1 Object as reference for the upcoming loop

for (int i = 1; i < someAmount; i++)
{
objectWasInserted = false;

for (int c = 0; c < orderedList.Count; c++)
{

if (basicList[i].Key > orderedList[c].Key) // The Key of the current object is higher than the key of the current object of the ordered List
{
orderedList.Insert(c, basicList[i]);
objectWasInserted = true;
break;
}

}

if (!objectWasInserted)
{
orderedList.Add(basicList[i]);
}
}

即使这样可行,但速度太慢了。 经过50000个物体的测试,已经需要8秒钟。

LINQ方法OrderBy要快得多。

orderedList = basicList.OrderByDescending(x => x.Key).ToList();

50000物件仅需7毫秒!

然而,这是一个辅助方法,我想摆脱它,而是使用我自己的算法来按键排序对象列表。

我也尝试过LinkedList而不是普通的List。这有点快,但仍然远离LINQ方法。

有没有办法,加快对象的排序? :)

提前感谢您的帮助!!

2 个答案:

答案 0 :(得分:0)

如果你不想使用Linq(这对我来说很奇怪),你可以使用List<T>.Sort

basicList.Sort((o1,o2) => o1.Key.CompareTo(o2.Key));

注意:此方法将修改原始列表,而不是创建新列表。

答案 1 :(得分:0)

即使您想使用自己的算法,它也不会像在LINQ OrderByDescending()方法中实现的算法一样高效和快速。我们不知道在LINQ中使用了哪种排序算法,但我们知道它已经过优化,实现效率高并且使用框架的功能,否则它不需要7毫秒来排序50000个物体。

看看this page,考虑不同的排序算法。

如果您要更改编程语言,则必须使用该编程语言的功能。如果您必须更改编程语言,那么在已经存在的情况下开始实施排序算法对我来说没有意义,这对于您当前使用的语言(如C#)进行了优化。如果您已经知道您将使用哪种语言,那么请考虑语言可以提供的工具来解决您的问题。