鉴于我有一个对象列表。
如果ID
,这些对象具有属性So var obj = new Object();
obj.ID = 1;
现在这些对象具有前面的对象,前面的对象通过ID
链接像这样:
var obj1 = new Object();
var obj2 = new Object();
var obj3 = new Object();
var obj4 = new Object();
var obj5 = new Object();
obj5.precedingObjectId = obj4.Id;
obj4.precedingObjectId = obj3.Id;
obj3.precedingObjectId = obj2.Id;
obj2.precedingObjectId = obj1.Id;
如您所见,每个对象都链接到它之前的对象。 object2有一个前面的object1对象。
以递增方式命名的对象名称仅用于解释目的,因此我无法按名称排序。
现在我有一个这些对象的列表混乱了。所以我需要按前面的对象排序。 如果object2的前一个对象是object1,那么object1应该位于List
中的object2之前有办法做到这一点吗?
答案 0 :(得分:3)
如果您从每个Id创建一个查找该ID值的子项,那么这很简单。
一旦你有了这个查找,就可以从没有前一个对象的对象开始,然后得到“当前”对象先于的对象,直到你什么也得不到。
public static IEnumerable<Foo> Order(IEnumerable<Foo> sequence)
{
var lookup = sequence.ToLookup(foo => foo.precedingObjectId);
var current = lookup[null];
while (current.Any())
{
var foo = current.Single();
yield return foo;
current = lookup[foo.Id];
}
}