订单列表对象与C#中的另一个列表的顺序相同

时间:2016-05-16 17:08:12

标签: c# linq list

我有一个List对象如下:

  var list1 = new List<DummyObject> {
        new DummyObject { ID="1", UniqueCode="ltrasd8ShFwNEyWrPTd9jIJJQ" },
        new DummyObject { ID="2", UniqueCode="GB456rpcpxRYEeOr32w5oRMwg" },
        new DummyObject { ID="3", UniqueCode="Y7twLumNJU6dQZLR0KxqA"     },
        new DummyObject { ID="4", UniqueCode="nG3vejzzxkiO21oDt58vkw"    },
        new DummyObject { ID="5", UniqueCode="aPwwG1JMYUGTvOL2lG0YFg"    },            
    }

和Ids的另一个List对象定义是:

   List<int> list2  = new List<int>() { 2, 4, 5, 1, 3 };


我想按list1订购list2,结果应如下:

    var output= new List<DummyObject> {
        new DummyObject { ID="2", UniqueCode="ltrasd8ShFwNEyWrPTd9jIJJQ" },
        new DummyObject { ID="4", UniqueCode="GB456rpcpxRYEeOr32w5oRMwg" },
        new DummyObject { ID="5", UniqueCode="Y7twLumNJU6dQZLR0KxqA"     },
        new DummyObject { ID="1", UniqueCode="nG3vejzzxkiO21oDt58vkw"    },
        new DummyObject { ID="3", UniqueCode="aPwwG1JMYUGTvOL2lG0YFg"    },            
    }

有人可以在这里指导我如何使用LINQ

来实现这一目标

4 个答案:

答案 0 :(得分:3)

如果列表很小,那么你可以这样做:

var result = list1.OrderBy(x => list2.IndexOf(Convert.ToInt32(x.ID))).ToList();

如果列表很大,那么以下解决方案将表现更好:

//Create a dictionary that maps the integer values of the IDs to the objects
var dictionary = list1.ToDictionary(x => Convert.ToInt32(x.ID), x => x);

var result = list2.Select(x => dictionary[x]).ToList();

答案 1 :(得分:0)

您可以使用LINQ执行此操作:

var output = list1.OrderBy(dummyObject => list2.IndexOf(int.Parse(dummyObject.ID))).ToList();

答案 2 :(得分:0)

Join保留外部序列(list2)元素的顺序,并且对于每个元素,内部序列(list1)的匹配元素的顺序

var output = list2.Join(list1, i => i.ToString(), o => o.ID, (i,o) => o)
                  .ToList();

答案 3 :(得分:0)

试试这个

var _orderedList = (from l2 in list2 join l1 in list1 on l2 equals int.Parse(l1.ID) select l1).ToList();