试图弄清楚如何在没有LINQ的情况下进行快速复杂的排序

Fre*_*dou 1 c# sorting

我想我太习惯使用LINQ,但这很慢,我确实使用了一个分析器,它耗费了65%的时间用于我正在尝试做的事情

var unlock = Locked.OrderBy(x => x.Weight) //double
                   .ThenByDescending(x => x.Stuff?.Level ?? 100) //int
                   .ThenBy(x => x.Penalty) //double
                   .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

Locked是一个列表,我知道排序会改变列表,但我并不在乎,我只是想让它工作(如果可能的话),下面的代码不会给出与上面的LINQ相同的结果;

Locked.Sort(delegate (Node a, Node b)
{
    int xdiff = a.Weight.CompareTo(b.Weight);

    if (xdiff != 0) return xdiff;

    var aStuff = a.Stuff?.Level ?? 100;
    var bStuff = b.Stuff?.Level ?? 100;

    xdiff = -1 * aStuff.CompareTo(bStuff);

    if (xdiff != 0) return xdiff;

    return xdiff = a.Penalty.CompareTo(b.Penalty);
});

var unlock = Locked[0];
Run Code Online (Sandbox Code Playgroud)

首先,是否可以使用List.Sort进行复杂的排序?asc /然后desc /然后asc?

如果是的话,我的错误在哪里?

接下来是,有没有更快的方式做我正在尝试做的事情?

Mar*_*ell 9

如果您刚好在"第一个或默认"(最小/最大)之后,则无需进行排序 - 您可以在单个O(N)传递中执行此操作.选择第一项并将其存储在变量中; 现在循环遍历所有其他项目:如果您的标准更可取:将其推入变量中.当你走到尽头,你就有了胜利者.