C#列表集 - 排序

时间:2012-05-20 12:19:32

标签: c# list sorting

我正在寻找一种有效的方法来相互“链接”数组/列表,并根据其中一个数组对所有列表/数组进行同步排序。

例如,假设我有三个列表:

List<double> Data1;
List<double> Data2;
List<double> Data3;

列表中的项目显然与结构无关,但我希望它们是。例如Data1 [0],Data2 [0]和Data3 [0]是相关的。

所以现在我想根据Data1从最大到最小排序三个列表的集合。我该怎么做才能让所有三个列表保持同步?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

使项目在结构上相关:

public class Data {
  public double Data1 { get; set; }
  public double Data2 { get; set; }
  public double Data3 { get; set; }
}

拥有List<Data>,您可以轻松地对其中一个属性进行排序:

theList.Sort((x, y) => x.Data2.CompareTo(y.Data2));

答案 1 :(得分:1)

您可以使用Zip将数组绑定在一起,然后使用投影类型按特定点排序:

List<double> Data1;
List<double> Data2;
List<double> Data3;

var orderedByDataOne = Data1
    .Zip(Data2, (one, two) => new {one, two})
    .Zip(Data3, (zipped, three) => new {zipped.one, zipped.two, three})
    .OrderBy(x => x.one)

答案 2 :(得分:1)

我会创建一个匿名类型列表,它将所有三个相应列表中的值组合在一起,根据您想要的字段进行排序,然后将排序后的值投影回各自的列表中:

var combined =
    Enumerable.Range(0, Data1.Count)
              .Select(i => new
              {
                  Item1 = Data1[i],
                  Item2 = Data2[i],
                  Item3 = Data3[i],
              })
              .OrderBy(c => c.Item1)
              .ToList();

Data1 = combined.Select(c => c.Item1).ToList();
Data2 = combined.Select(c => c.Item2).ToList();
Data3 = combined.Select(c => c.Item3).ToList();