C# Linq对DataTable数据分组,组内数据再以多个列排序和自定义排序

首次发布:2025-09-03
/// <summary>
/// 数据
/// </summary>
/// <returns></returns>
private DataTable CreateTable()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("LX");
    dt.Columns.Add("JXLX");
    dt.Columns.Add("FZ");
    dt.Columns.Add("PF");
    dt.Columns.Add("PJZ");
    dt.Columns.Add("FZZ");
    dt.Columns.Add("JL");

    dt.Columns.Add("U");
    dt.Columns.Add("I");
    dt.Columns.Add("JTCS");
    dt.Columns.Add("YCQ");
    dt.Columns.Add("MCWUYX");

    dt.Rows.Add("220;5", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;5", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;5", "合元[三相四线]有功", "最小", "0.5C");

    dt.Rows.Add("220;5", "A相[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;5", "A相[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;5", "A相[三相四线]有功", "最小", "0.5C");

    dt.Rows.Add("220;5", "B相[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;5", "B相[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;5", "B相[三相四线]有功", "最小", "0.5C");

    dt.Rows.Add("220;5", "C相[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;5", "C相[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;5", "C相[三相四线]有功", "最小", "0.5C");

    dt.Rows.Add("220;5", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;5", "合元[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("220;5", "合元[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("220;5", "A相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;5", "A相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("220;5", "A相[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("220;5", "B相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;5", "B相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("220;5", "B相[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("220;5", "C相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;5", "C相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("220;5", "C相[三相四线]有功", "最大", "0.5C");


    dt.Rows.Add("100;5", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;5", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;5", "合元[三相三线]有功", "最小", "0.5C");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最小", "0.5C");

    dt.Rows.Add("100;5", "C相[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;5", "C相[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;5", "C相[三相三线]有功", "最小", "0.5C");

    dt.Rows.Add("100;5", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;5", "合元[三相三线]有功", "最大", "0.5L");
    dt.Rows.Add("100;5", "合元[三相三线]有功", "最大", "0.5C");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最大", "0.5L");
    dt.Rows.Add("100;5", "A相[三相三线]有功", "最大", "0.5C");

    dt.Rows.Add("100;5", "C相[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;5", "C相[三相三线]有功", "最大", "0.5L");
    dt.Rows.Add("100;5", "C相[三相三线]有功", "最大", "0.5C");


    dt.Rows.Add("220;100", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;100", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;100", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;100", "合元[三相四线]有功", "最大", "0.5L");

    dt.Rows.Add("220;60", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;60", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;60", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;60", "合元[三相四线]有功", "最大", "0.5L");

    dt.Rows.Add("220;40", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;40", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;40", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;40", "合元[三相四线]有功", "最大", "0.5L");

    dt.Rows.Add("220;20", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;20", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;20", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;20", "合元[三相四线]有功", "最大", "0.5L");


    dt.Rows.Add("220;10", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;10", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;10", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;10", "合元[三相四线]有功", "最大", "0.5L");

    dt.Rows.Add("220;1", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;1", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;1", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;1", "合元[三相四线]有功", "最大", "0.5L");

    dt.Rows.Add("220;0.1", "合元[三相四线]有功", "最小", "1.0");
    dt.Rows.Add("220;0.1", "合元[三相四线]有功", "最小", "0.5L");
    dt.Rows.Add("220;0.1", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("220;0.1", "合元[三相四线]有功", "最大", "0.5L");


    dt.Rows.Add("100;100", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;100", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;100", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;100", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;60", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;60", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;60", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;60", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;40", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;40", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;40", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;40", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;20", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;20", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;20", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;20", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;10", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;10", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;10", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;10", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;1", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;1", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;1", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;1", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("100;0.1", "合元[三相三线]有功", "最小", "1.0");
    dt.Rows.Add("100;0.1", "合元[三相三线]有功", "最小", "0.5L");
    dt.Rows.Add("100;0.1", "合元[三相三线]有功", "最大", "1.0");
    dt.Rows.Add("100;0.1", "合元[三相三线]有功", "最大", "0.5L");

    dt.Rows.Add("57.7;5", "合元[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("57.7;5", "合元[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("57.7;5", "合元[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("57.7;5", "A相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("57.7;5", "A相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("57.7;5", "A相[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("57.7;5", "B相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("57.7;5", "B相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("57.7;5", "B相[三相四线]有功", "最大", "0.5C");

    dt.Rows.Add("57.7;5", "C相[三相四线]有功", "最大", "1.0");
    dt.Rows.Add("57.7;5", "C相[三相四线]有功", "最大", "0.5L");
    dt.Rows.Add("57.7;5", "C相[三相四线]有功", "最大", "0.5C");

    return dt;
}
private int GetSortPriority(string testResult)
{
    switch (testResult)
    {
        case "0.5L":
            return 1;
        case "1.0":
            return 2;
        case "0.5C":
            return 3;
        default:
            return 99; // 未知值放在最后
    }
}
public void DataHandler()
{
    DataTable dataTable = CreateTable();
    // 从 DataTable 中获取数据并进行分组
    var groupedData = dataTable.AsEnumerable()
        .GroupBy(row => new
        {
            量限 = row.Field<string>("LX"), // 假设“量限(V,A)”列的数据类型是 string
            负载 = row.Field<string>("FZ")        // 假设“负载”列的数据类型是 string
        });
    //遍历每一组数据
    foreach (var group in groupedData)
    {
        Console.WriteLine($"===== 量限: {group.Key.量限}, 负载: {group.Key.负载} =====");
        Console.WriteLine("组内数据行:");

        // 先按"其它字段"排序,再按测试结果的自定义顺序排序
        var sortedRows = group
            .OrderBy(row => row.Field<string>("JXLX"))  // 先按其它字段排序
            .ThenBy(row => GetSortPriority(row.Field<string>("PF")));  // 再按测试结果排序
        //遍历组内排序后的数据
        foreach (var row in sortedRows)
        {
            Console.WriteLine($"LX: {row.Field<string>("LX")}, " +
                              $"FZ: {row.Field<string>("FZ")}, " +
                               $"PF: {row.Field<string>("PF")}, " +
                              $"JXLX: {row.Field<string>("JXLX")}"); // 根据实际字段类型调整
        }
    }

}

本文来自 www.LuoFenMing.com