对象结构
一个类有多个数据列表。
类
List1 的双
列表 2 的双
List3 的双
双的List4
目标: 根据一个列表对多个列表进行排序。例如。 List1
按升序排列,所有其他列表都遵循该顺序以保持基于索引的各个点相关性。
我尝试过的初始实现是:
- 将
List2
、3 和 4 与 List 1 压缩,然后根据 List 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
- 尝试在不同列表上使用
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;
}
}
您可以通过调用...来使用它
var list21 = list2.SortLike(list1);
此方法的优点是它非常快,尽管其中有两个 ToArray()
调用。 ToArray()
创建集合的浅拷贝,只需几毫秒即可处理包含 1000 万个项目的列表。 Array.Sort
速度很快,因为它会根据数组的大小选择最佳排序算法。
关于c# - 基于一个列表对多个列表进行排序 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34090307/