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

     2023-02-19     213

关键词:

【中文标题】如何在末尾使用空列值对 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

【讨论】:

将 DataTable 列值与行过滤器 C# 中的枚举进行比较

】将DataTable列值与行过滤器C#中的枚举进行比较【英文标题】:CompareDataTableColumnValuewithEnuminRowFilterC#【发布时间】:2017-08-0708:05:24【问题描述】:我有一个要使用DataView过滤的数据表。过滤条件基于枚举值和字符串数据表列值。... 查看详情

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

】C#DataTable->需要根据列值生成一个ID【英文标题】:C#DataTable->NeedtogenerateanIDbasedonthecolumnvalues【发布时间】:2021-08-1910:03:07【问题描述】:ValueIDAAABBC期望的输出ValueIDA1A1A1B2B2C3我需要根据对值列进行分组来创建ID。所有A和B的... 查看详情

从 C# 中的 DataTable 中获取 Distinct Column 以及其他列值

】从C#中的DataTable中获取DistinctColumn以及其他列值【英文标题】:TakingDistinctColumnalongwithothercolumnvaluesalsofromDataTableinC#【发布时间】:2013-12-1610:43:28【问题描述】:我有一个数据表,其中有4个列。Col1、Col2、Col3、Col4。我想过滤DataT... 查看详情

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

】Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回【英文标题】:Pyspark:Howtoreturnatuplelistofexistingnonnullcolumnsasoneofthecolumnvaluesindataframe【发布时间】:2018-02-1905:30:42【问题描述】:我正在使用pyspark数据框,它是... 查看详情

c#计算datatable中某一列值的和

doublesumPercentage=dt.AsEnumerable().Where(dr=>{returndt.Rows.IndexOf(dr)>0;}).Sum(e=>Convert.ToDouble(e.Field<String>(6)))//计算某一列的值总和EnumerableRowCollectionerc=dt.AsEnumerable().Where 查看详情

如何根据日期值对 html 表列值进行排序

】如何根据日期值对html表列值进行排序【英文标题】:HowtosortanhtmltablecolumnvaluesbasedonDatevalues【发布时间】:2021-06-2914:51:37【问题描述】:我正在使用一些存储的数据库(EF)值并将它们显示在html表中以生成报告(通过API请求)。... 查看详情

如何在 C# 中使用正则表达式解析重复的名称-值对

】如何在C#中使用正则表达式解析重复的名称-值对【英文标题】:HowtoParseRepeatedName-ValuePairsusingRegexinC#【发布时间】:2021-09-0904:07:21【问题描述】:我正在尝试使用C#中的正则表达式从文本中解析键/值标记字符串。例如,给定字... 查看详情

在 C# 中使用 ReadBlock 方法时,如何判断何时到达文件末尾?

】在C#中使用ReadBlock方法时,如何判断何时到达文件末尾?【英文标题】:HowcanItellwhenI\'vereachedtheendofthefilewhenusingtheReadBlockmethodinC#?【发布时间】:2011-09-2106:14:33【问题描述】:我注意到它会一遍又一遍地返回相同的读取字符,... 查看详情

加载 DataTable 时使用默认列值以避免 Null

】加载DataTable时使用默认列值以避免Null【英文标题】:UsedefaultcolumnvalueswhenloadingDataTabletoavoidNulls【发布时间】:2013-07-1020:11:36【问题描述】:我有一个xsd数据集架构,它允许我为DataTable定义一个结构。对于每一列,我都设置了... 查看详情

ASP.NET C#中如何在excel中下载gridview,即如何在datatable中使用group by

】ASP.NETC#中如何在excel中下载gridview,即如何在datatable中使用groupby【英文标题】:howtodownloadgridviewinexcelinASP.NETC#,ieHowtousegroupbyindatatable【发布时间】:2021-10-1401:43:36【问题描述】:如果我有一个具有以下布局的数据表:Column1Column2... 查看详情

如何在 UWP c# 中用 DataTable 内容填充 DataGrid

】如何在UWPc#中用DataTable内容填充DataGrid【英文标题】:HowtofillDataGridwithDataTablecontentinUWPc#【发布时间】:2019-05-1219:14:24【问题描述】:我正在创建一个UWP应用并尝试使用包含来自我的数据库的数据的DataTable填充我的DataGrid,但没... 查看详情

如何根据列值对 xy 散点图中的点进行着色?

】如何根据列值对xy散点图中的点进行着色?【英文标题】:HowcanIcolordotsinaxyscatterplotaccordingtocolumnvalue?【发布时间】:2013-06-1603:45:43【问题描述】:考虑以下工作表:ABCD1COMPANYXVALUEYVALUEGROUP2Apple4535red3Xerox4538red4KMart6350orange5Exxon5359... 查看详情

C#如何通过ID从数据表中获取两列值

】C#如何通过ID从数据表中获取两列值【英文标题】:C#howtogettwocolumnvaluesbyIDfromadatatable【发布时间】:2021-04-1403:18:13【问题描述】:我对数据库和SQL不太了解,所以我想在这里寻求帮助,虽然我知道这应该是基本知识,但作为一... 查看详情

如何从 DataTable 中获取一列值的列表?

】如何从DataTable中获取一列值的列表?【英文标题】:HowtogetlistofonecolumnvaluesfromDataTable?【发布时间】:2014-07-0707:11:45【问题描述】:我有数据表。DataTabledt=newDataTable();dt.Columns.Add(newDataColumn("id",Type.GetType("System.Int32")));dt.Columns.Add(... 查看详情

由于使用自动增量添加到表中,如何使用更新的数据刷新 C# DataTable?

...于使用自动增量添加到表中,如何使用更新的数据刷新C#DataTable?【英文标题】:HowtorefreshaC#DataTablewithupdateddataduetoaddingtotablewithautoincrement?【发布时间】:2015-03-2321:40:52【问题描述】:将数据推送到数据库后,如何用新更新的数... 查看详情

如何在 C# 中将 DataTable 转换为通用列表 [重复]

】如何在C#中将DataTable转换为通用列表[重复]【英文标题】:HowtoConvertDataTabletoGenericListinC#[duplicate]【发布时间】:2016-12-1608:54:08【问题描述】:我需要将C#DataTable转换为通用集合列表DataTableColumnsRespectively1.EmpId(thisisIntDataType)2.EmpNam... 查看详情

DataTable 末尾有一个下拉列

】DataTable末尾有一个下拉列【英文标题】:DataTablewithadropdownColumnattheend【发布时间】:2021-11-1419:46:17【问题描述】:我已经有一个DataTable(dt)。现在我想在表格末尾有一列,我可以在其中使用下拉菜单选择不同的数字。我只是找... 查看详情

在c#中到达数组的末尾或开头时如何环绕索引?

】在c#中到达数组的末尾或开头时如何环绕索引?【英文标题】:Howtowraparoundtheindexwhenreachingtheendorbeginningofanarrayinc#?【发布时间】:2021-10-3001:39:32【问题描述】:我目前正在为FPS编写武器脚本,我想用鼠标滚轮切换武器。我创建... 查看详情