订购列表<>对象的另一个链接对象ID

时间:2014-09-15 17:49:05

标签: c# algorithm sorting collections

鉴于我有一个对象列表。

如果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之前

有办法做到这一点吗?

1 个答案:

答案 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];
    }
}