我有一个对象列表(obj1
),在每个对象中我有另一个对象列表,如下所示:
List <Obj1> obj1
Obj1
string Name
List <Obj2> obj2
Obj2
string Name
int Id
我想按照obj1
obj2
列表标记的顺序订购Id
列表。
obj2
列表中的第一个元素定义obj1
列表的顺序,如果它们相同,则第二个元素定义顺序,依此类推,直到obj2
列表的末尾。
示例数据:
结果数据:
答案 0 :(得分:1)
以下解决方案将使用IComparable
和int CompareTo(object obj)
的{{1}}方法实现Obj2
界面。
Obj1
必须与Obj2
进行比较,Id
将Obj1
进行比较。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) }