在C#中进行DataTable操作:根据列数据插入一些汇总行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中进行DataTable操作:根据列数据插入一些汇总行相关的知识,希望对你有一定的参考价值。

参考技术A 可以根据DataTable中的数据行循环,新增一个汇总行,然后计算添加。追问

请说得详细点,怎样计算才能达到上面的效果??

参考技术B 你那个Group的三级是否为一个树形结构?可以留联系详细看看!追问

Group不是一个事先维护好的类别表,所以我提问的那个源表是被我分组排好序的,现就就是想根据Group分别加上三级,二级,一级大类的汇总,如果一个产品类别中出现重复,只要汇总一行。

如何在末尾使用空列值对 C# Datatable 进行排序

【中文标题】如何在末尾使用空列值对 C# Datatable 进行排序【英文标题】:How to sort C# Datatable with empty column values at the end 【发布时间】:2020-07-29 06:46:47 【问题描述】:

我有一个包含 1000 行的 C# 数据表。但主要的 200 行有空值(多列)。过滤器会发生在这些列上,作为最后占用的空值。我希望输出将在带有过滤器的表或新表中发生,但不是作为 linq 行。请帮帮我

图片说话更多,请参考此以更好地理解:

【问题讨论】:

您必须先对列中是否有数据的行进行排序,然后按行列值排序 使用 LINQ 将是一个简单的orders.OrderBy(x => string.IsNullOrEmpty(x))(或string.IsNullOrWhiteSpace)。如果您也想按内容订购,只需在之后添加.ThenBy。如果没有 LINQ,您将不得不实现自定义 IComparer<string>。这是你想要的还是你指的是不同的东西? @MyNameIsDND 我的回答能解决你的问题吗? 【参考方案1】:

这里有两件事你应该考虑:

    空值”:要对后面跟着空值列的项目进行排序,您需要.OrderBy(s => String.IsNullOrEmpty(s["OrderNo"].ToString()))订单无格式”:要对自定义订单号进行排序,您需要使用IComparer<string>。正如您在问题中显示的那样,我假设Order No 的格式可以是XXXXXXXXX-XXXX

所以你需要首先OrderBy 空值ThenBy 你的自定义IComparer<string> 是这样的:

public class OrderNoComparer : IComparer<string>

    public int Compare(string x, string y)
    
        int xFirstValue = 0;
        int xSecondValue = 0;

        int yFirstValue = 0;
        int ySecondValue = 0;

        if (x.Contains("-"))
        
            xFirstValue = Convert.ToInt32(x.Split(new char[]  '-' )[0]);
            xSecondValue = Convert.ToInt32(x.Split(new char[]  '-' )[1]);
        
        else
        
            xFirstValue = Convert.ToInt32(x);
        

        if (y.Contains("-"))
        
            yFirstValue = Convert.ToInt32(y.Split(new char[]  '-' )[0]);
            ySecondValue = Convert.ToInt32(y.Split(new char[]  '-' )[1]);
        
        else
        
            yFirstValue = Convert.ToInt32(y);
        


        if (xFirstValue > yFirstValue)
        
            return 1;
        
        else if (xFirstValue < yFirstValue)
        
            return -1;
        
        else //means equal
        
            if (xSecondValue > ySecondValue)
            
                return 1;
            
            else if (xSecondValue == ySecondValue)
            
                return 0;

            
            else
            
                return -1;
            
        
    

完整的例子在这里:

DataTable dtOrder = new DataTable();
dtOrder.Columns.Add("OrderNo");

var dr1 = dtOrder.NewRow();
dr1["OrderNo"] = "";
dtOrder.Rows.Add(dr1);

var dr2 = dtOrder.NewRow();
dr2["OrderNo"] = "569-875";
dtOrder.Rows.Add(dr2);

var dr3 = dtOrder.NewRow();
dr3["OrderNo"] = "569975";
dtOrder.Rows.Add(dr3);

var dr4 = dtOrder.NewRow();
dr4["OrderNo"] = "569865";
dtOrder.Rows.Add(dr4);

var dr5 = dtOrder.NewRow();
dr5["OrderNo"] = "569-975";
dtOrder.Rows.Add(dr5);

var dr6 = dtOrder.NewRow();
dr6["OrderNo"] = "569-875";
dtOrder.Rows.Add(dr6);


var result = dtOrder.AsEnumerable().AsQueryable()
                .OrderBy(s => String.IsNullOrEmpty(s["OrderNo"].ToString()))
                .ThenBy(o => o["OrderNo"].ToString(), new OrderNoComparer())
                .ToList();

foreach (var item in result)

    Console.WriteLine(item["OrderNo"]);

那么输出就会像你预期的那样:

569-875
569-875
569-975
569865
569975

【讨论】:

以上是关于在C#中进行DataTable操作:根据列数据插入一些汇总行的主要内容,如果未能解决你的问题,请参考以下文章

c# DataTable

c# DataTable

c# DataTable

c#中datatable怎么添加列名

C# DataTable -> 需要根据列值生成一个ID

更改DataTable某列的值。C#