我想我太习惯使用LINQ了,但是这很慢,我确实使用了探查器,它消耗了我尝试执行的时间的65%的时间
var unlock = Locked.OrderBy(x => x.Weight) //double
.ThenByDescending(x => x.Stuff?.Level ?? 100) //int
.ThenBy(x => x.Penalty) //double
.FirstOrDefault();
锁定是一个列表,我知道排序会改变列表,但是我并不在乎,我只是想使其工作(如果可能),下面的代码不会产生与上面的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];
第一件事是,可以使用List.Sort进行这种复杂的排序吗? asc /然后desc /然后asc?
如果是,我的错误在哪里?
接下来是,有没有一种更快的方式来做我想做的事情?
最佳答案
如果您只是在“第一个或默认”(最小/最大)之后,则不需要排序-您可以通过一次O(N)遍来进行此操作。选择第一项并将其存储在变量中;现在依次遍历所有其他项:如果您的标准更可取:将其放入变量中。当您走到尽头时,您就有了赢家。
关于c# - 试图弄清楚如何在不使用LINQ的情况下进行快速复杂的排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51181665/