C#当有空单元格时按几列降序对数据表进行排序

Posted

技术标签:

【中文标题】C#当有空单元格时按几列降序对数据表进行排序【英文标题】:C# Sort data table descending by a few columns when there is empty cells 【发布时间】:2020-11-29 11:47:57 【问题描述】:

我有两个 (int) 列的表:countSelectedglobalCount。我想先按countSelected 降序排列表格,然后按globalSelected 降序排列。 我试过了:

DataTable dt = myTable;
if (dt.Rows.Count > 0)

    dt = dt.AsEnumerable().OrderByDescending(x => x.Field<int>("countSelected")).ThenByDescending(x => x.Field<int>("GlobalCount"))
           .Select(x => x)
           .CopyToDataTable();
 

但它是bad:"System.InvalidCastException"。也许是因为一些单元格是空的。 我该如何解决这个问题?

【问题讨论】:

您确定数据类型吗?尝试添加“?”在 int 之后。您也可以检查 DBNull.value。 你尝试过像“Int.Parse(x.countSelected)”这样的简单转换吗? 如果您的 DataTable 用作某些控件的 DataSource:myTable.DefaultView.Sort = "countSelected DESC, GlobalCount DESC";。控件使用 DataTable.DefaultView 作为数据源,因此数据将显示为已排序(而 DataTable 的行顺序保持不变)。如果没有绑定,又想生成一个新的DataTable,那么Sortvar dt = myTable.DefaultView.ToTable();。如果您的 DataTable 已绑定,我建议使用 BindingSource 作为 DataSource mediator 对象,并使用其 Sort 方法对数据进行排序。 谢谢!你的回答我成功了! 【参考方案1】:

这两列有不同的大小写样式是否正确?你确定它们是可空的 32 位整数吗?

然后试试这个:

DataTable dt = myTable;
if (dt.Rows.Count > 0)

    dt = dt.AsEnumerable()
           .OrderByDescending(x => x.Field<int?>("countSelected"))
           .ThenByDescending(x => x.Field<int?>("GlobalCount"))
           .Select(x => x)
           .CopyToDataTable();
 

【讨论】:

以上是关于C#当有空单元格时按几列降序对数据表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按降序对数组进行排序的更好方法

Firebase 按降序对数据进行排序。 (只排序了一半。)

如何按日期降序对数据表进行排序

如何在 Reactjs 中按升序或降序对数据进行排序?

如何按降序对列表视图项进行排序

如何根据php中日期列的降序对mysql结果数组进行排序?