对象结构 一个类有多个数据列表。
Class
List1 of double
List2 of double
List3 of double
List4 of double
目标:根据一个列表对多个列表进行排序。例如List1,按升序排列,所有其他列表都遵循该顺序,以维持基于索引的各个点的相对性。
我尝试过的初步实现是:
List2、 3 和 4 与列表 1 一起压缩,然后根据列表 1 进行排序。然后再次组合排序的列表。例如
var x1 = testData.SelectMany(d => d.xData).ToList();
var y1 = modelData.SelectMany(d => d.yData).ToList();
var y2 = modelData.SelectMany(d => d.y2Data).ToList();
var sampleValues = x1.Zip(y1, (x, y) => new { X = x, Y = y }).OrderBy(v => v.X);
var sampleValues1 = x1.Zip(y2, (x, y) => new { X = x, Y2 = y }).OrderBy(v => v.X);`
//Next select X, Y from sampleValues and select Y2 from sampleValue2
Run Code Online (Sandbox Code Playgroud)
SelectMany在不同的列表上使用,然后将其放入匿名类型。SelectMany不适用于此,因为它需要返回明确的数据类型。这些方法中我缺少的任何内容,或者需要另一种方法来实现我想要实现的目标。
另外,拥有一个包含所有这些数据或列表作为单独行和列内数据的类对我来说不是一个选择。这是因为我有一个具有这些属性的对象列表。因此,最终我想合并对象 SampleData 列表中的列表数据,然后排序并使用该数据。
如果需要更多信息,请随时告诉我。
有一种不太知名的方法Array.Sort可以根据第二个数组的顺序对数组进行排序。我制作了一个利用这个老方法的小扩展方法:
public static class ICollectionExtensions
{
public static IEnumerable<TSource> SortLike<TSource,TKey>(this ICollection<TSource> source,
IEnumerable<TKey> sortOrder)
{
var cloned = sortOrder.ToArray();
var sourceArr = source.ToArray();
Array.Sort(cloned, sourceArr);
return sourceArr;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过调用...来使用它
var list21 = list2.SortLike(list1);
Run Code Online (Sandbox Code Playgroud)
此方法的优点是速度非常快,尽管ToArray()其中有两次调用。ToArray()创建集合的浅表副本,对于包含 1000 万个项目的列表只需要几毫秒。Array.Sort速度很快,因为它根据数组的大小选择最佳的排序算法。