【问题标题】:Ordering a List<> of Objects by another Linked Object ID按另一个链接对象 ID 对对象列表<> 排序
【发布时间】:2014-09-15 17:49:05
【问题描述】:

鉴于我有一个对象列表。

这些对象有一个属性 if 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 之前

有没有办法做到这一点?

【问题讨论】:

  • 您到底想完成什么?看看这个问题stackoverflow.com/questions/188141/…
  • 那个问题不能解决我的问题。我无法对对象的任何属性进行排序。如果一个对象是另一个对象的前一个对象,则前一个对象必须在列表之前

标签: c# algorithm sorting collections


【解决方案1】:

如果您创建从每个 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];
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多