我正在寻找一种有效的方法来相互“链接”数组/列表,并根据其中一个数组对所有列表/数组进行同步排序。
例如,假设我有三个列表:
List<double> Data1;
List<double> Data2;
List<double> Data3;
列表中的项目显然与结构无关,但我希望它们是。例如Data1 [0],Data2 [0]和Data3 [0]是相关的。
所以现在我想根据Data1从最大到最小排序三个列表的集合。我该怎么做才能让所有三个列表保持同步?
提前感谢您的帮助!
答案 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();