根据一个列表C#对多个列表进行排序
本文关键字:列表 排序 一个 | 更新日期: 2023-09-27 18:25:35
对象结构一个类有多个数据列表。Class
List1 of double
List2 of double
List3 of double
List4 of double
目标:根据一个列表对多个列表进行排序。例如,按升序排列的List1
和所有其他列表都遵循该顺序,以保持基于索引的单个点相关性。
我尝试过的最初实现是:
- 用列表1压缩
List2
、3和4,然后根据列表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
之所以快速,是因为它为数组的大小选择了最佳排序算法。
您可以执行以下操作:
var listA = new List<double> { 1.0, 2.0, 3.0 };
var listB = new List<double> { 1.1, 2.1, 3.1 };
var listC = new List<double> { 1.2, 2.2, 3.2 };
var listD = new List<double> { 1.3, 2.3, 3.3 };
var items = new List<Tuple<double, double, double, double>>();
for (var i = 0; i < listA.Count; ++i)
items.Add(Tuple.Create(listA[i], listB[i], listC[i], listD[i]));
var sorted = items.OrderBy(x => x.Item1);
listA = sorted.Select(x => x.Item1).ToList();
listB = sorted.Select(x => x.Item2).ToList();
listC = sorted.Select(x => x.Item3).ToList();
listD = sorted.Select(x => x.Item4).ToList();
你最好做这样的事情:
public class MyClass
{
public double A { get; set; }
public double B { get; set; }
public double C { get; set; }
public double D { get; set; }
}
然后使用List<MyClass>
而不是四个不同的列表。
开始
double[] input1 = ..., input2 = ..., input3 = ..., input4 = ...;
var sortIndex = Enumerable.Range(0, input1.Count).OrderBy(i => input1[i]).ToList();
var output1 = sortIndex.Select(i => input1[i]).ToList();
var output2 = sortIndex.Select(i => input2[i]).ToList();
var output3 = sortIndex.Select(i => input3[i]).ToList();
var output4 = sortIndex.Select(i => input4[i]).ToList();