gpt4 book ai didi

c# - 将 LINQ orderby 转换为就地列表排序

转载 作者:太空狗 更新时间:2023-10-29 22:09:49 24 4
gpt4 key购买 nike

目前,我正在使用 LINQ to objects 对列表进行排序,然后执行 ToList()关于结果:

var SortedPossibleMoveLocations = (from PML in PossibleMoveLocations
orderby Randomiser.Next()
orderby IsSameType(PML) ? (_Owner[PML] as TileFlowing).UnitsWithin : 0
orderby PossibleMoveLocationOrdering(PML)
select PML).ToList();

我想将其转换为就地排序,我想使用 List<T>.Sort()方法。如果我只按一件事订购,我会知道该怎么做,但是,因为我按 PossibleMoveLocationOrdering 订购(返回 int )然后 IsSameType(PML) ? (_Owner[PML] as TileFlowing).UnitsWithin : 0计算结果为 int , 然后通过 Randomiser.Next() (它返回一个随机整数)我不知道该怎么做。

问题:我如何编写比较函数(或是否有更好的方法)来对上面的 LINQ 查询进行 implace 排序。

最佳答案

首先,指定三个 orderby子句是个坏主意 - 相反,仅使用逗号分隔指定多个顺序。

我也不热衷于使用 Randomiser.Next() 的想法用于订购,但那是一边。

您的 LINQ 查询应该如下所示(目前仍带有 Randomiser):

var query = (from PML in PossibleMoveLocations
orderby PossibleMoveLocationOrdering(PML),
IsSameType(PML) ? (_Owner[PML] as TileFlowing).UnitsWithin : 0,
Randomiser.Next()
select PML).ToList();

就我个人而言,我会为此使用点符号:

var query = PossibleMoveLocations
.OrderBy(pml => PossibleMoveLocationOrdering(PML))
.ThenBy(pml => IsSameType(pml) ?
(_Owner[pml] as TileFlowing).UnitsWithin : 0)
.ThenBy(pml => Randomiser.Next())
.ToList();

要就地排序,您基本上需要一个 Comparison<T>IComparer<T>它可以测试多个东西,还有一个使用属性创建比较器的实现。您可以手动执行此操作(根据 Marc 的代码),但碰巧的是,我在 MiscUtil 中有一些辅助类和扩展方法。 :

var comparer = ProjectionComparer<PossibleMove>
.Create(pml => PossibleMoveLocationOrdering(PML));
.ThenBy(pml => IsSameType(pml) ? ...)
.ThenBy(...);

list.Sort(comparer);

请注意,使用 Randomizer绝对是个坏主意,因为它会在每次比较时调用(对于第一部分相同的对象)...这会导致不一致的比较,例如 x < y < z < x .

关于c# - 将 LINQ orderby 转换为就地列表排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6328612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com