【发布时间】:2014-04-28 19:45:49
【问题描述】:
我目前正在测试按键值排序列表的最佳算法。
我有一个非常简单的对象(以下代码 sn-ps 来自 C#)
class BasicObject
{
int Key;
}
构造对象时随机设置Key。
所以我有一个 BasicObject 对象列表,需要按最后的键值排序。
List<BasicObject> basicList = new List<BasicObject>();
for (int i = 0; i < someAmount; i++)
{
basicList.Add(new BasicObject());
}
我的想法是,创建一个名为orderedList 左右的新列表,并每次循环遍历它,对于每个BasicObject,并检查其 Key 是否高于当前 Value 或更低。
类似的东西:
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 方法还很远。
那么有没有办法稍微加快对象的排序? :)
提前感谢您的帮助!
【问题讨论】:
-
你能解释一下 Linq 有什么问题吗'但是这是一个辅助方法,我想摆脱它,而是使用我自己的算法通过键对对象列表进行排序。 '?
-
是的。通过稍后更改编程语言,我可能无法使用 Linqs 方法。所以我期待拥有自己的所有类,尽可能减少对库的依赖
-
如果你要改变编程语言,那么就不可能有
List<T>类,或者根本就没有类。然后考虑不要使用集合和类 -
这就是我问的原因。也许它更有效,在 BasicObjects 之间使用数组或某种连接......
-
使用您现在使用的语言和框架的力量会更有效。另外我相信所有高级语言都内置了对集合进行排序的功能
标签: c# performance linq list