DataTable排序结果的纠正

默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.DefaultView.Sort ="XXX ASC"排序时,都是按字符串排序处理的,并不是我们想要的结果,下面给出了二种解决办法:

using System;
using System.Data;

namespace DataTableSortSample
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Month");
            dt.Rows.Add("1");
            dt.Rows.Add("11");
            dt.Rows.Add("2");
            dt.Rows.Add("12");
            dt.DefaultView.Sort = "Month ASC";
            dt = dt.DefaultView.ToTable();

            foreach (DataRow s in dt.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            Console.WriteLine("----------------------------------");


            #region 方法1:将月份补齐为2位 (前提:补齐这种方案并非所有需求都能接受,这个要看该列的业务含义)
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dt.Rows[i]["Month"] = dt.Rows[i]["Month"].ToString().PadLeft(2, '0');
            }
            dt.DefaultView.Sort = "Month ASC";

            dt = dt.DefaultView.ToTable();

            foreach (DataRow s in dt.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            #endregion

            Console.WriteLine("----------------------------------");

            #region 方法2:建一个新DataTable,将Month列类型,修改成int型,然后导入数据
            DataTable dtNew = dt.Clone();
            dtNew.Columns["Month"].DataType = typeof (int);//重新指定列类型为int型
            foreach (DataRow s in dt.Rows)
            {
                dtNew.ImportRow(s);//导入旧数据
            }

            dtNew.DefaultView.Sort = "Month ASC";
            dtNew = dtNew.DefaultView.ToTable();

            foreach (DataRow s in dtNew.Rows)
            {
                Console.WriteLine(s["Month"]);
            }
            #endregion
            Console.Read();

        }
    }
}

  运行结果:

1 11 12 2 ---------------------------------- 01 02 11 12 ---------------------------------- 1 2 11 12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农阿宇

C# 获取一个独一无二的字符串 GUID

在保存文件,创建目录时,为了保证名称不重复,经常使用Random产生一个随机数,有更简单且不会重复的办法是: Guid.NewGuid().ToString()...

281100
来自专栏菩提树下的杨过

DataTable,List去重复记录的方法

今天一位朋友问如何去掉DataTable里重复的记录(DataTable是别人返回过来的,不能再重新查询数据库,所以无法用sql中的select distinc...

295100
来自专栏跟着阿笨一起玩NET

C#中汉字排序简单示例(拼音/笔划)

31610
来自专栏Netkiller

使用 HttpClient 调用 Restful 接口

本文节选自《Netkiller Java 手札》 import java.io.IOException; import org.apache.http.Htt...

42260
来自专栏技术之路

Linq 和DefaultView两种方法去掉DataTable 里的重复行

在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复 一般我们是想把重复的删除掉,还有其它的方式实现比如用Lin...

20460
来自专栏跟着阿笨一起玩NET

linq to sql 三层架构中使用CRUD操作

16910
来自专栏C#

C#的DataTable操作方法

1.将泛型集合类转换成DataTable(表中无数据时使用): public static DataTable NullListToDataTable(IL...

29470
来自专栏魂祭心

原 数据字典+匿名委托模拟switch/c

30190
来自专栏Jackson0714

01.策略模式-上篇

35580
来自专栏跟着阿笨一起玩NET

C# 4.0命名参数和可选参数

Named And Optional Arguments - 命名参数和可选参数

7810

扫码关注云+社区

领取腾讯云代金券