【问题标题】:How to sort a column in a DataTable that contains both of numbers and strings numerically如何对包含数字和字符串的DataTable中的列进行数字排序
【发布时间】:2018-01-10 19:08:51
【问题描述】:

我的 dataTable 中有一些列由 DatagridView 查看,其中包含一些整数单元格(正或负)和一些无法将其值转换为整数的单元格。例如,空单元格。如何对这样的列数据进行排序。 我试过了

     dataTable.Columns.Add("ID", typeof(int));

但此代码会出错,因为某些单元格值无法转换为整数。

简而言之,我需要在数字排序时忽略字符串。

【问题讨论】:

  • 那么所有非数字值应该如何相互排序,数字和非数字值应该如何相互排序?
  • 在数字排序时可以将非数字值扔到列的顶部或底部。这对我来说就足够了,我不需要它们按字母顺序排列
  • 如果 NaturalSort 不适合您(忽略 alpha 字符),您可以为列提供自己的排序器

标签: c# datagridview datatable type-conversion


【解决方案1】:

您必须使用object 类型而不是特定类型进行比较,并创建自定义比较函数。

例如:

int Compare(object a, object b)
{
    if (a is string && b is string)
    { 
        return ((string)a).CompareTo((string)b);
    }
    if (a is int && b is int)
    {
        return ((int)a).CompareTo((int)b);
    }
    else
    {
        //Maybe here you also would throw an error if a or b was 
        //an unexpected type like DateTime

        return a.ToString().CompareTo(b.ToString());
    }
}

然后使用此比较对网格或列表进行排序。

实现可能会比我写的更复杂,让用户觉得很自然。

Natural Sort Order in C#

【讨论】:

  • OP 不清楚他们是在谈论一栏还是一栏以上。如果它是包含数字和字母字符的一列,则 DataColumn 将是字符串 - DGV 不会知道如何解析或格式化Object。此外,自然排序器无法满足 忽略字符串 的要求(我的意思是忽略字母字符)
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 2022-11-23
  • 2016-01-23
  • 2019-03-28
  • 2021-02-22
  • 2016-10-28
相关资源
最近更新 更多