Linq實現DataTable行轉列效果

在數據統計與分析中,經常會遇到將數據的行列進行轉換整合,以更直觀的展示分析結果。今天的C#程序將使用Linq實現DataTable行轉列效果。

轉換前的table:

轉換後的table:

代碼:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ConvertToTable
{
    class Program
    {
        static void Main(string[] args)
        {
            #region  添加一個表
            DataTable _dt = new DataTable();
            _dt.Columns.Add(new DataColumn("staff_id", typeof(int)) { DefaultValue = 0 }); //員工 id
            _dt.Columns.Add(new DataColumn("staff_Name", typeof(string)) { DefaultValue = "1" });  //員工名字
            _dt.Columns.Add(new DataColumn("staff_TiCheng", typeof(string)) { DefaultValue = "1" });//員工提成規則
            _dt.Columns.Add(new DataColumn("staff_TiChengAmount", typeof(double)) { DefaultValue = 0 });  //提成錢數

            _dt.Rows.Add(1, "小李", "零點提成", 60);
            _dt.Rows.Add(1, "小李", "訂房提成", 70);
            _dt.Rows.Add(2, "小張", "零點提成", 500);
            _dt.Rows.Add(2, "小張", "訂房提成", 60);
            _dt.Rows.Add(2, "小張", "訂單提成", 800);
            _dt.Rows.Add(3, "小王", "零點提成", 30);
            _dt.Rows.Add(3, "小王", "訂單提成", 900);
            #endregion
            //輸出原始表
            Console.WriteLine("原始表:");
            DisplayTable(_dt);
            //輸出行轉列以後的表
            Console.WriteLine("轉換以後的表:");
            DisplayTable(ConvertToTable(_dt));
            Console.ReadLine();
        }

        #region  轉換表
        static DataTable ConvertToTable(DataTable source)
        {
            DataTable dt = new DataTable();
            //前兩列是固定的加上
            dt.Columns.Add("staff_id");
            dt.Columns.Add("staff_Name");
            //以staff_TiCheng 字段爲篩選條件  列轉爲行  下面有圖
            var columns = (from x in source.Rows.Cast<DataRow>() select x[2].ToString()).Distinct();
            //把 staff_TiCheng 字段 做爲新字段添加進去
            foreach (var item in columns) dt.Columns.Add(item).DefaultValue = 0;
            //  x[1] 是字段 staff_Name 按  staff_Name分組 g 是分組後的信息  g.Key 就是名字  如果不懂就去查一個linq group子句進行分組
            var data = from x in source.Rows.Cast<DataRow>()
                      group x by x[1] into g
                      select new { Key = g.Key.ToString(), Items = g };
            data.ToList().ForEach(x =>
            {
                //這裏用的是一個string 數組 也可以用DataRow根據個人需要用
                string[] array = new string[dt.Columns.Count];
                //array[1]就是存名字的
                array[1] = x.Key;
                //從第二列開始遍歷
                for (int i = 2; i < dt.Columns.Count; i++)
                {
                    // array[0]  就是 staff_id
                    if (array[0] == null)
                        array[0] = x.Items.ToList<DataRow>()[0]["staff_id"].ToString();
                        //array[0] = (from y in x.Items
                        //            where y[2].ToString() == dt.Columns[i].ToString()
                        //            select y[0].ToString()).SingleOrDefault();
                    //array[i]就是 各種提成
                    array[i] = (from y in x.Items
                                where y[2].ToString() == dt.Columns[i].ToString()//  y[2] 各種提成名字等於table中列的名字
                                select y[3].ToString()                            //  y[3] 就是我們要找的  staff_TiChengAmount 各種提成 的錢數
                              ).SingleOrDefault();
                }
                dt.Rows.Add(array);  //添加到table中
            });               
            return dt;
        }
        /// <summary>
        /// 輸出表
        /// </summary>
        /// <param name="dt"></param>
        static void DisplayTable(DataTable dt)
        {
            //輸出列的標題
            dt.Columns.Cast<DataColumn>().ToList().ForEach(x => Console.Write(x + "\t"));
            Console.WriteLine();
            //輸出每行的信息
            dt.Rows.Cast<DataRow>().ToList().ForEach(x =>
            {
                x.ItemArray.ToList().ForEach(y => Console.Write(y.ToString() + "\t\t"));
                Console.WriteLine();
            });
        }

        #endregion
    }
}

//以staff_TiCheng 字段爲篩選條件 列轉爲行 下面有圖

// x[1] 是字段 staff_Name

y[2] 各種提成名字等於table中列的名字

關鍵詞:Linq  DataTable 

發佈了13 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章