Linq 實現 DataTable 行轉列

前幾天寫了一篇sqlserver? 行轉列,http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html

由于工作需要,要把查出來的DataTable實現 行轉列,

正好這一陣子在用Linq 就做了一個行轉列的小例 子

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

?

本文轉自lpxxn博客園博客,原文鏈接:http://www.cnblogs.com/li-peng/archive/2012/02/27/2370213.html,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio之編譯提示\app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容

1 問題 Android Studio新建立的項目運行莫名其妙提示錯誤如下 app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容 然后我把res目錄下面的colors.xml文件打開看如下 <?xml version"1.0" encoding"utf-8"?> <resources>&l…

python順序執行 toggle_編寫腳本在Python中運行多個腳本

我正在建一個鬧鐘項目。誰能告訴我如何編寫一個腳本來調用所有其他腳本嗎。例如&#xff0c;我在我的樹莓派上有三個腳本叫做LCDTESTFORPI.py&#xff0c;另一個叫做“ex 7”分段.py“還有一個叫”報警pi.py”. 我希望能夠運行一個名為“alarmpi”的腳本_初始py“它將運行所有其…

AndroidService 深度分析(2)

AndroidService 深度分析&#xff08;2&#xff09; 上一篇文章我們Service的生命周期進行了測試及總結。這篇文章我們介紹下綁定執行的Service的實現。 綁定執行的Service可能是僅為本應用提供服務&#xff0c;稱為本地Service。也可能為其它應用提供跨進程服務&#xff0c;即…

Hello Playwright:(3)基本概念

下面介紹一下 Playwright 中的基本概念&#xff1a;Headless 瀏覽器Playwright 需要特定版本的瀏覽器二進制文件才能運行。這些瀏覽器都支持 2 種 運行模式&#xff1a;Headless&#xff0c;無瀏覽器 UI&#xff0c;運行速度較快&#xff0c;常用于自動化運行Headed&#xff0c…

[python opencv 計算機視覺零基礎到實戰] 十二 直方圖

一、學習目標 了解matplotlib繪圖庫的使用了解如何通過折線圖或者直方圖對圖表進行繪制了解了通過圖標對圖片內容進行直觀判斷 如有錯誤歡迎指出~ 二、了解圖像直方圖及其應用 2.1 了解matplotlib庫 在了解圖像直方圖前我們需要了解一個matplotlib庫&#xff0c;matplotli…

建造者模式之項目運用

1 問題 建造者模式&#xff0c;我們也許不陌生&#xff0c;因為我們看到很多開源框架或者Android源碼里面用到&#xff0c;類似這樣的代碼結構 A a new A.builder().method1("111").method2("222").build(); 很明顯&#xff0c;一般這里的結構有builde…

專題三--1005

題目 A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the …

shell中的數字

shell中的數字 author :headsen chen date :2017-10-18 15:01:42 個人原創&#xff0c;轉載請注明作者&#xff0c;出處&#xff0c;否則依法追究法律責任 1,生成隨機數&#xff08;范圍&#xff1a;0-32767&#xff09;&#xff0c;用特殊變量&#xff1a;RANDOM 2&#xff…

serviceloader java_【java編程】ServiceLoader使用看這一篇就夠了

轉載:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少聽過spi&#xff0c;具體的解釋我就不多說了。但是它具體是怎么實現的呢&#xff1f;它的原理是什么呢&#xff1f;下面我就圍繞這兩個問題來解釋&#xff1a;實現: 其實具體的實現類就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改進

在MiniAPI系列中&#xff0c;《.NET6之MiniAPI(十八)&#xff1a;OpenAPI swagger》介紹了swagger在MiniAPI框架中的使用&#xff0c;當時留下很多不足&#xff0c;隨著.NET7 Preview4的推出&#xff0c;這方面得到了很大的改進&#xff0c;我還是使用“十八”這篇文章的案例。…

Swift - 自定義單元格實現微信聊天界面

1&#xff0c;下面是一個放微信聊天界面的消息展示列表&#xff0c;實現的功能有&#xff1a; &#xff08;1&#xff09;消息可以是文本消息也可以是圖片消息&#xff08;2&#xff09;消息背景為氣泡狀圖片&#xff0c;同時消息氣泡可根據內容自適應大小&#xff08;3&#x…

[python opencv 計算機視覺零基礎到實戰] 十三 直方圖顏色提鮮

一、學習目標 了解了均衡化的作用是什么了解灰度、YUV、彩色圖片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分離通道的方法是什么 如有錯誤歡迎指出~ 二、了解圖像均衡化 2.1 了解直方圖均衡化 圖像直方圖均衡化主要是對圖像中的少數灰度進行壓縮&#…

java 中字符串比較方法_java中常用的字符串的比較方法(兩種)

比較字符串比較常用的兩個方法是運算符“”和String的equals方法。使用“”比較兩個字符串&#xff0c;是比較兩個對象的的“地址”是否一致&#xff0c;本質就是判斷兩個變量是否指向同一個對象&#xff0c;如果是則返回true&#xff0c;否則返回的是false。而String類的equal…

Android之稍微靠譜點的透明Activity(不獲取觸摸事件)

1 問題 實現透明的Activity(不獲取觸摸事件),就行什么也看不到,打開了透明activity,也不影響其他頁面的滑動和點擊,就行什么事情都沒發生一樣。 2 代碼實現 1)配置樣式 <style name="TestTheme" parent="Theme.AppCompat.Light"><item na…

分布式服務框架dubbo原理解析 轉

alibaba有好幾個分布式框架&#xff0c;主要有&#xff1a;進行遠程調用(類似于RMI的這種遠程調用)的(dubbo、hsf)&#xff0c;jms消息服務(napoli、notify)&#xff0c;KV數據庫(tair)等。這個框架/工具/產品在實現的時候&#xff0c;都考慮到了容災&#xff0c;擴展&#xff…

【傾情奉獻】遙感物候研究:30年長時間序列遙感數據集GIMMS 3g NDVI產品預處理完整步驟

本文為作者碩士學位論文遙感物候研究數據處理過程總結。GIMMS(Global Inventory Modelling and Mapping Studies) 3g NDVI來源于ECOCAST網站(http://ecocast.arc.nasa.gov),是由NOAA衛星搭載的AVHRR傳感器獲取的全球植被數據,空間分辨率為0.0833?,時間分辨率為15?d,一…

過早的給方法中 引用對象 設為 null 可被 GC提前回收嗎?

經常在代碼中看到有人將 null 賦值給引用類型&#xff0c;來達到讓 GC 提前回收的目的&#xff0c;這樣做真的有用嗎&#xff1f;今天我們就來研究一下。為了方便講解&#xff0c;來一段測試代碼&#xff0c;提前將 test1null &#xff0c;然后調用 GC.Collect() 看看是否能提前…

[python opencv 計算機視覺零基礎到實戰] 十五 直方圖反向投影

一、學習目標 了解了直方圖反向投影的一般流程了解2D直方圖的使用 如有錯誤歡迎指出~ 二、了解直方圖反向投影 2.1 了解2D直方圖 需要對直方圖進行反向投影&#xff0c;需要使用2D直方圖。2D直方圖需要使用calcHist方法。calcHist方法在前兩節中已經有了解&#xff0c;現在…