c# - 基于一个列表对多个列表进行排序 C#

标签 c# linq

对象结构 一个类有多个数据列表。 类 List1 的双 列表 2 的双 List3 的双 双的List4

目标: 根据一个列表对多个列表进行排序。例如。 List1 按升序排列,所有其他列表都遵循该顺序以保持基于索引的各个点相关性。

我尝试过的初始实现是:

  1. 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
  1. 尝试在不同列表上使用 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/

相关文章:

c# - 如何通过 C# 控制台循环访问 Excel 应用程序中的列?

c# - 为什么这个变量得不到正确的值?

c# - EntityFramework.dll 中出现 'System.ArgumentException' 类型的异常,但未在用户代码中处理

c# - OrderBy的效率和延迟执行

c# - 处理命令并直接在命令上定义连接时,连接是否关闭?

c# - 将项目上传到开源存储库时,是否应该删除 bin 和 obj 文件夹?

c# - .NET MVC3 图片上传相关错误 : conversion from type 'System.Web.HttpPostedFileWrapper' to type 'Project.Domain.Entities.Image'

c# - 如何将 Bitmap 转换为 byte[]?

linq - 使用 LINQ 在单个查询中插入 2 个表

c# - 按顺序搜索缺失的数字