C# 订购列表<&燃气轮机;由另一个链接对象ID创建的对象

C# 订购列表<&燃气轮机;由另一个链接对象ID创建的对象,c#,algorithm,sorting,collections,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 = obj

我有一张物品清单

如果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应位于列表中object2的前面


有什么方法可以做到这一点吗?

如果您创建一个从每个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];
    }
}
公共静态IEnumerable顺序(IEnumerable序列)
{
var lookup=sequence.ToLookup(foo=>foo.precingObjectId);
var current=lookup[null];
while(current.Any())
{
var foo=current.Single();
收益率;
当前=查找[foo.Id];
}
}

如果您创建从每个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];
    }
}
公共静态IEnumerable顺序(IEnumerable序列)
{
var lookup=sequence.ToLookup(foo=>foo.precingObjectId);
var current=lookup[null];
while(current.Any())
{
var foo=current.Single();
收益率;
当前=查找[foo.Id];
}
}

如果您创建从每个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];
    }
}
公共静态IEnumerable顺序(IEnumerable序列)
{
var lookup=sequence.ToLookup(foo=>foo.precingObjectId);
var current=lookup[null];
while(current.Any())
{
var foo=current.Single();
收益率;
当前=查找[foo.Id];
}
}

如果您创建从每个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];
    }
}
公共静态IEnumerable顺序(IEnumerable序列)
{
var lookup=sequence.ToLookup(foo=>foo.precingObjectId);
var current=lookup[null];
while(current.Any())
{
var foo=current.Single();
收益率;
当前=查找[foo.Id];
}
}

你到底想完成什么?检查这个问题,这个问题不能解决我的问题。我无法对对象的任何属性进行排序。如果一个对象是另一个对象的前一个对象,则前一个对象必须位于列表中的前一个对象之前,您到底想实现什么?检查这个问题,这个问题不能解决我的问题。我无法对对象的任何属性进行排序。如果一个对象是另一个对象的前一个对象,则前一个对象必须位于列表中的前一个对象之前,您到底想实现什么?检查这个问题,这个问题不能解决我的问题。我无法对对象的任何属性进行排序。如果一个对象是另一个对象的前一个对象,则前一个对象必须位于列表中的前一个对象之前,您到底想实现什么?检查这个问题,这个问题不能解决我的问题。我无法对对象的任何属性进行排序。如果一个对象是另一个对象的前一个对象,则前一个对象必须位于列表的前面