我想我太习惯使用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?
如果是的话,我的错误在哪里?
接下来是,有没有更快的方式做我正在尝试做的事情?
如果您刚好在"第一个或默认"(最小/最大)之后,则无需进行排序 - 您可以在单个O(N)传递中执行此操作.选择第一项并将其存储在变量中; 现在循环遍历所有其他项目:如果您的标准更可取:将其推入变量中.当你走到尽头,你就有了胜利者.