按对象列出对象c#

时间:2017-08-18 07:29:41

标签: c# list sorting

我有一个对象列表(obj1),在每个对象中我有另一个对象列表,如下所示:

List <Obj1> obj1

Obj1

  • string Name
  • List <Obj2> obj2

Obj2

  • string Name
  • int Id

我想按照obj1 obj2列表标记的顺序订购Id列表。

obj2列表中的第一个元素定义obj1列表的顺序,如果它们相同,则第二个元素定义顺序,依此类推,直到obj2列表的末尾。

示例数据:

  • “测试”:{(“A”,2),(“B”,3)}
  • “Test2”:{((“C”,1),(“D”,2)}
  • “Test3”:{((“A”,2),(“B”,2),(“C”,3)}

结果数据:

  • “Test2”:{((“C”,1),(“D”,2)}
  • “Test3”:{((“A”,2),(“B”,2),(“C”,3)}
  • “测试”:{(“A”,2),(“B”,3)}

1 个答案:

答案 0 :(得分:1)

以下解决方案将使用IComparableint CompareTo(object obj)的{​​{1}}方法实现Obj2界面。
Obj1必须与Obj2进行比较,IdObj1进行比较。List<Obj2>。 有了它,您可以在列表中调用Sort(),如:List<Obj1>

此处ideone is my full working live example with complete code

以下是上面描述的代码片段:

class Obj2 : IComparable
{
    public string Name { get; set; }
    public int Id { get; set; }

    // ...

    public int CompareTo(object obj)
    {
        Obj2 other = obj as Obj2;
        return Id.CompareTo(other.Id);
    }
}

class Obj1 : IComparable
{
    public string Name { get; set; }
    public List<Obj2> Objects { get; set; }

    // ...

    public int CompareTo(object obj)
    {
        Obj1 other = obj as Obj1;
        /* loop until one list ends */
        for (int idx = 0; idx < Objects.Count && idx < other.Objects.Count; ++idx)
        {
            int comparison = Objects[idx].Id.CompareTo(other.Objects[idx].Id);
            /* if not equal return */
            if (comparison != 0)
            {
                return comparison;
            }
        }
        /* if they were equal until now use count to compare */
        return Objects.Count - other.Objects.Count;
    }
}

产生的结果:

"Test2" : { ("C", 1) ("D", 2) }
"Test3" : { ("A", 2) ("B", 2) ("C", 3) }
"Test" : { ("A", 2) ("B", 3) }