程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【轉】Linq實現DataTable行列轉換

【轉】Linq實現DataTable行列轉換

編輯:C#入門知識

出處:http://www.cnblogs.com/li-peng/

轉換前的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中列的名字

作者:李鵬 出處:http://www.cnblogs.com/li-peng/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved