C# DataTable按日期字段排序(学习笔记)

DataTable不能直接排序,但DataView的Sort方法提供了排序

在这里插入图片描述

实列

class Program
{
    static void Main(string[] args)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Id");
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");
        dt.Columns.Add("CreateTime");
        dt.Rows.Add(new object[] { 1, "张三", 17, "2018-09-09 14:02:53" });
        dt.Rows.Add(new object[] { 2, "李四", 18, "2019-10-09 09:28:36" });
        dt.Rows.Add(new object[] { 3, "王五", 19, "2020-10-01 12:30:53" });
        dt.Rows.Add(new object[] { 4, "李二", 20, "2020-10-03 12:23:13" });
        dt.Rows.Add(new object[] { 4, "李二", 20, "2020-10-03 12:23:13" });
        dt.Rows.Add(new object[] { 5, "麻子", 21, "2020-10-05 12:59:03" });
        dt.Rows.Add(new object[] { 6, "张三", 32, "2020-11-03 13:29:08" });

        Console.WriteLine("------------------------------------------------------------1.直接对DataTable数据排序");
        //dt.DefaultView.Sort = "Id DESC"; //按Id降序排序
        //dt.DefaultView.Sort = "Id Asc"; //按Id升序排序
        //dt.DefaultView.Sort = "Id DESC,Name desc"; //按Id降序和Name降序排序
        //dt.DefaultView.Sort = "Id DESC,Name Asc"; //按Id降序和Name升序排序
        //dt.DefaultView.Sort = "CreateTime DESC"; //按CreateTime降序排序
        dt.DefaultView.Sort = "CreateTime Asc"; //按CreateTime升排序
        dt = dt.DefaultView.ToTable();//返回一个新的DataTable
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[i]["Id"].ToString(), dt.Rows[i]["Name"].ToString(), dt.Rows[i]["Age"].ToString(), dt.Rows[i]["CreateTime"].ToString());
        }

        Console.WriteLine("------------------------------------------------------------2.直接对DataTable数据去重");
        dt = dt.DefaultView.ToTable(true, "Id", "Age", "Name", "CreateTime");
        for (int j = 0; j < dt.Rows.Count; j++)
        {
            Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[j]["Id"].ToString(), dt.Rows[j]["Name"].ToString(), dt.Rows[j]["Age"].ToString(), dt.Rows[j]["CreateTime"].ToString());
        }

        //Console.WriteLine("------------------------------------------------------------按某列去重方法1");
        //dt = DeleteSameRow(dt, "Name");
        //for (int j = 0; j < dt.Rows.Count; j++)
        //{
        //    Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[j]["Id"].ToString(), dt.Rows[j]["Name"].ToString(), dt.Rows[j]["Age"].ToString(), dt.Rows[j]["CreateTime"].ToString());
        //}

        Console.WriteLine("------------------------------------------------------------按某列去重方法2");
        dt = DistinctSomeColumn(dt, "Name");
        for (int j = 0; j < dt.Rows.Count; j++)
        {
            Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[j]["Id"].ToString(), dt.Rows[j]["Name"].ToString(), dt.Rows[j]["Age"].ToString(), dt.Rows[j]["CreateTime"].ToString());
        }

        Console.Read();
    }

    public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName)
    {
        if (fieldName == null || fieldName.Length == 0) return sourceTable;
        return sourceTable.AsEnumerable().Distinct(new ColumnEquals(fieldName)).CopyToDataTable();
    }

    #region 删除DataTable重复列,类似distinct
    /// <summary>   
    /// 删除DataTable重复列,类似distinct   
    /// </summary>   
    /// <param name="dt">DataTable</param>   
    /// <param name="Field">字段名</param>   
    /// <returns></returns>   
    public static DataTable DeleteSameRow(DataTable dt, string Field)
    {
        ArrayList indexList = new ArrayList();
        // 找出待删除的行索引   
        for (int i = 0; i < dt.Rows.Count - 1; i++)
        {
            if (!IsContain(indexList, i))
            {
                for (int j = i + 1; j < dt.Rows.Count; j++)
                {
                    if (dt.Rows[i][Field].ToString() == dt.Rows[j][Field].ToString())
                    {
                        indexList.Add(j);
                    }
                }
            }
        }
        indexList.Sort();
        // 排序
        for (int i = indexList.Count - 1; i >= 0; i--)// 根据待删除索引列表删除行  
        {
            int index = Convert.ToInt32(indexList[i]);
            dt.Rows.RemoveAt(index);
        }
        return dt;
    }

    /// <summary>   
    /// 判断数组中是否存在   
    /// </summary>   
    /// <param name="indexList">数组</param>   
    /// <param name="index">索引</param>   
    /// <returns></returns>   
    public static bool IsContain(ArrayList indexList, int index)
    {
        for (int i = 0; i < indexList.Count; i++)
        {
            int tempIndex = Convert.ToInt32(indexList[i]);
            if (tempIndex == index)
            {
                return true;
            }
        }
        return false;
    }
    #endregion

    public class ColumnEquals : IEqualityComparer<DataRow>
    {
        public ColumnEquals(string[] sArr)
        {
            _sArr = sArr;
        }

        private string[] _sArr;
        public bool Equals(DataRow x, DataRow y)
        {
            return !_sArr.Any(p => !x[p].Equals(y[p]));
        }

        public int GetHashCode(DataRow obj)
        {
            return obj.ToString().GetHashCode();
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值