使用其他列表中的对象对C#列表进行排序

时间:2014-03-13 09:12:48

标签: c# .net

有两个班级:

public class Object1
{
    public string Prop1 { get; set; }
}

public class Object2
{
    public string Prop2 { get; set; }
}

并且:

List<Object1> A;
List<Object2> B;

需要按A对列表Prop1的元素进行排序,方法与列表B中已Prop2排序的方式相同。 Prop1Prop2有重复,我无法删除我的解决方案中的重复项。所以我必须对列表A进行排序:

  1. 首先使用Prop1列出的列表A的对象与列表B中的Prop2排序的列表B的对象相同(列表B已经订购)
  2. 然后使用Prop1列出对象列表A的对象,列表B中不存在Prop2属性。
  3. 修改2014/03/13 14:20

    Prop1集合不是唯一的,并且具有重复性(与Prop2相同)

    修改2014/03/13 15:23

    一些例子。

    我有这个:

                var A = new List<Object1>
                {
                    new Object1{Prop1 = "a_b_c"},
                    new Object1{Prop1 = "x_y_z"},
                    new Object1{Prop1 = "a_b_c"},
                    new Object1{Prop1 = "a_b"},
                    new Object1{Prop1 = "a"},
                };
            var B = new List<Object2>
                {
                    new Object2{Prop2 = "a"},
                    new Object2{Prop2 = "a_b"},
                    new Object2{Prop2 = "a_b_c"},
                };
    

    预计在排序之后:

                var expected = new List<Object1>
                {
                    new Object1{Prop1 = "a"},
                    new Object1{Prop1 = "a_b"},
                    new Object1{Prop1 = "a_b_c"},
                    new Object1{Prop1 = "a_b_c"},
                    new Object1{Prop1 = "x_y_z"},
                };
    

2 个答案:

答案 0 :(得分:-1)

你很可能是必须的 在Enumerable.Intersect上查找共享对象类型和Enumerable.Except 第二种情况。

在那里,您可以实现自定义相等比较器来比较您的数据类型。

答案 1 :(得分:-1)

要按其他列表的顺序排序,您可以使用Join。这保留了外部集合的顺序(即B),您可以选择内部集合的元素作为结果,即A

var sortedA = B.Join (A, b => b.Prop2, a => a.Prop1, (b, a) => a).ToArray();

然后,您需要连接已排序集合中不存在的A元素。

var allA = A.Concat(A.Except(sortedA));