我有一个对象列表,需要将其转换为相当复杂的排序顺序。
尽管我在其他编程语言方面并不是新手,但对于linq和c#/.net我完全是个新手,因此我希望能得到一些方向性的提示。
我的列表(简化版)如下:
List[
{nr: 1, originatesFrom: null, lastChanged: DateTime(2018,5,3)},
{nr: 2, originatesFrom: null, lastChanged: DateTime(2018,5,3)},
{nr: 3, originatesFrom: null, lastChanged: DateTime(2018,5,3)},
{nr: 4, originatesFrom: 1, lastChanged: DateTime(2018,5,1)},
{nr: 5, originatesFrom: 2, lastChanged: DateTime(2018,5,1)},
{nr: 6, originatesFrom: 1, lastChanged: DateTime(2018,5,7)},
{nr: 7, originatesFrom: 1, lastChanged: DateTime(2018,5,4)},
{nr: 8, originatesFrom: 3, lastChanged: DateTime(2018,5,13)},
{nr: 9, originatesFrom: 1, lastChanged: DateTime(2018,5,13)},
{nr: 10, originatesFrom: 3, lastChanged: DateTime(2018,5,10)},
{nr: 11, originatesFrom: 3, lastChanged: DateTime(2018,5,18)}
]
我需要将其转化为类似于以下的内容:
我需要将其转化为可读性更强的文本。
List[
{nr: 5, originatesFrom: 2, lastChanged: DateTime(2018,5,1)},
{nr: 2, originatesFrom: null, lastChanged: DateTime(2018,5,3)},
{nr: 9, originatesFrom: 1, lastChanged: DateTime(2018,5,13)},
{nr: 6, originatesFrom: 1 lastChanged: DateTime(2018,5,7)},
{nr: 7, originatesFrom: 1, lastChanged: DateTime(2018,5,4)},
{nr: 4, originatesFrom: 1, lastChanged: DateTime(2018,5,1)},
{nr: 1, originatesFrom: null, lastChanged: DateTime(2018,5,3)},
{nr: 11, originatesFrom: 3, lastChanged: DateTime(2018,5,18)},
{nr: 8, originatesFrom: 3, lastChanged: DateTime(2018,5,13)},
{nr: 10, originatesFrom: 3, lastChanged: DateTime(2018,5,10)},
{nr: 3, originatesFrom: null, lastChanged: DateTime(2018,5,3)}
]
复杂的排序规则如下:按照 originatesFrom 进行分组,每个组内部按照 lastChanged 降序排序,并且组按照第一个实例的 lastChanged 升序排序。最后,originateFrom 中为 null 的应该放在每个组的底部,与 originateFrom 中的 nr 匹配。 (是的-这不是开箱即用的东西:-/)我已经尝试按 originatesFrom 对它们进行分组,但我真的需要将它们分开,以便可以单独对它们进行排序(我想?),而且我不确定是否明智使用 linq,而不是逐一处理所有对象,构建多个列表,最终将它们连接起来?好的一面是,很少会有真正的许多对象(因此效率可能不是太大的问题)。在排序之前,我不知道会有多少组,每个组会有多少对象。如果需要更好地解释排序规则,请告诉我!
lastChanged
- Jon Skeet