C#根据另一个List(不同类)的值序列对List进行排序

时间:2012-04-24 10:27:11

标签: c# .net linq

我目前遇到的问题是我有2个列表,我想根据第一个List中的值对第二个List进行排序,这是一个例子:

public class data
{
    public string Name{get; set;}
    public int ID{get; set}
}
public class dataToSort
{
    public int ID{get; set;}
    public string retrievedData{get; set}
    public string timeStamp{get; set}
}

所以假设我有2个List对象,一个用于数据,一个用于dataToSort,它们的内容如下:

data: "Alpha", "80"           dataToSort: "21", "XA", "YA"
      "Beta", "47"                        "47", "XB", "YB"
      "Charlie", "153"                    "80", "XC", "YC"
      "Delta", "21"                       "153","XD", "YD"

所以我想要做的是使dataToSort的顺序等于数据中ID的顺序,如下所示:

dataToSort: "80", "XC", "YC"
            "47", "XB", "YB"
            "153","XD", "YD"
            "21", "XA", "YA"

我已经尝试使用Google搜索排序这些方法,但所有LINQ语法都让我感到困惑,因为每个对象的类不同而我遇到了问题:(我能想到的唯一方法就是让for循环得到一个List的ID的索引并执行类似冒泡的排序,但它太麻烦而且效率低下。非常感谢帮助!

5 个答案:

答案 0 :(得分:5)

您可以加入ID上的两个列表:

var query = from x in data
            join y in dataToSort on x.ID equals y.ID
            select y;

var result = query.ToList();

这保持了第一个列表data的顺序。


您也可以通过这种方式轻松组合这两个列表:

var query = from x in data
            join y in dataToSort on x.ID equals y.ID
            select new
            {
                x.Name,
                x.ID,
                y.retrievedData,
                y.timeStamp,
            };

var result = query.ToList();

答案 1 :(得分:0)

像这样的东西可以做到这一点(伪代码):

dataToSort sortedData;

foreach data
{
    sortedData.AddRange(from unsortedData.Where(x => x.ID == data.ID));
}

答案 2 :(得分:0)

您可以按IndexOf

加入这两个列表并订购
var ordered = (from ds in dataToSort
              join d in data
              on ds.ID equals d.ID
              orderby data.IndexOf(d)
              select ds).ToList();

答案 3 :(得分:0)

List<data> lstofdata = new List<data>();
List<dataToSort> lstdataToSort = new List<dataToSort>();

var q = from d in lstofdata 
        join s in lstdataToSort on d.ID equals s.ID 
        orderby d.Name 
        select s

答案 4 :(得分:0)

这应该可以解决问题:

var list = dataList
           .Select(data => dataToSortList
               .First(x => x.ID == data.ID)
           )
           .ToList();