DataTable的计算功能(转)
生活随笔
收集整理的這篇文章主要介紹了
DataTable的计算功能(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C#--詳解DataTable的計算功能? using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
namespace WindowsApplication1
{
? public partial class Form1 : Form
? {
? ?
? public Form1()
? {
? InitializeComponent();
? }
? ?
? private void button1_Click(object sender, EventArgs e)
? {
? ?
? System.Data.DataTable table = new DataTable();
? //計算常量,可以沒有初始化列
? object test = table.Compute("1+1", "");
? Console.WriteLine(test);
? //test=2;
? test = table.Compute("1+1", "false");
? Console.WriteLine(test);
? //test=2;常數(shù)計算和filter無關(guān)
? test = table.Compute("abs(1)", "");
? Console.WriteLine(test);
? //test=null,不知道為這個什么沒有抱錯,而且返回null,其他的數(shù)學函數(shù)都會抱錯
? test = table.Compute("2%2", "");
? Console.WriteLine(test);
? //test=0;
? //其他函數(shù)參考下面的計算列
? //初始化datatale
? table.Columns.Add("id", typeof(string));
? table.Columns.Add("value", typeof(int));
? for (int i = 1; i <= 10; i++)
? {
? System.Data.DataRow dRow = table.NewRow();
? dRow["id"] = "id"+i.ToString();
? dRow["value"] = i;
? table.Rows.Add(dRow);
? }
? ?
? //test = table.Compute("value+1", "true");
? 拋出異常,這里必須是聚合函數(shù)
? //*************************************支持的聚合函數(shù)**********************//
? ?
? //求數(shù)量
? test = table.Compute("count(id)", "false");
? Console.WriteLine(test);?
? //test=0;
? test = table.Compute("count(id)", "true");
? Console.WriteLine(test);?
? //test=10;
? //求和
? test = table.Compute("sum(value)", "");
? Console.WriteLine(test);
? //test=55;
? //test = table.Compute("sum(id)","");
? 拋出異常,這里不能是string
? ?
? //平均
? test = table.Compute("avg(value)", "");
? Console.WriteLine(test);
? //test=5;
? //最小
? test = table.Compute("min(value)", "");
? Console.WriteLine(test);
? //test=1;
? //最大
? test = table.Compute("max(value)", "");
? Console.WriteLine(test);
? //test=10;
? //統(tǒng)計標準偏差
? test = table.Compute("StDev(value)", "");
? Console.WriteLine(test);
? //test=3.02765035409749
? //統(tǒng)計方差
? test = table.Compute("Var(value)", "");
? Console.WriteLine(test);
? //test=9.16666666666667
? //復(fù)雜計算
? test = table.Compute("max(value)/sum(value)", "");
? Console.WriteLine(test);
? //test=0.181818181818182
?
? /*******************************************計算列*************************/
? System.Data.DataColumn column = new DataColumn("exp1",typeof(float));
? table.Columns.Add(column);
? //簡單計算
? column.Expression = "value*2";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2;
? //字符串函數(shù)
? column.Expression = "len(id)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=3;
? //字符串函數(shù)
? column.Expression = "len(' '+id+' ')";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=5;
? //字符串函數(shù)
? column.Expression = "len(trim(' '+id+' '))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=3;
? //字符串函數(shù)
? column.Expression = "substring(id,3,len(id)-2)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1; //substring的起始字符位置為1不是0
? //類型轉(zhuǎn)換
? column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1.6;
? //相當于sqlserver的isnull
? column.Expression = "isnull(value,10)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1;
? //三元運算符,相當于sqlserver的case when
? column.Expression = "iif(value>5,1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2000;
? //like運算符
? column.Expression = "iif(id like '%1',1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1000;
? //in運算符
? column.Expression = "iif(id not in('id1'),1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2000;
? //嵌套的三元運算
? column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=4000;
? //客戶端計算所占總數(shù)的百分比
? column.Expression = "value/sum(value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=0.01818182?
? //客戶端計算差值,比如nba常規(guī)賽的勝場差
? column.Expression = "max(value)-value";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=9
? ?
? //***********************父子表計算*************************************/
? //初始化子表,父子表關(guān)系
? DataTable tableChild = new DataTable();
? ?
? tableChild.Columns.Add("id", typeof(string));
? tableChild.Columns.Add("value", typeof(int));
? System.Data.DataSet ds = new DataSet();
? ds.Tables.Add(tableChild);
? ds.Tables.Add(table);
? DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);
? ds.Relations.Add(relation);
? for (int i = 1; i <= 10; i++)
? {
? System.Data.DataRow dRow = tableChild.NewRow();
? dRow["id"] = "id1";
? dRow["value"] = i;
? tableChild.Rows.Add(dRow);
? }
? //計算子表記錄數(shù)
? column.Expression = "count(child(relation).value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=10;
? ?
? //計算父子表的百分比
? column.Expression = "value/sum(child(relation).value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=0.01818182;
? //計算父子表的差值,比如父表為庫存數(shù)量,子表為訂購數(shù)量,計算得出需要補充的數(shù)量
? column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=-54;
? //比較遺憾的是沒有發(fā)現(xiàn)能夠計算同比和環(huán)比的方法,而且計算列無法作為約束
? //************結(jié)束,DataTable可以讓你盡量發(fā)揮聰明才智來減少繁雜的sql語句并且減輕服務(wù)器計算符合^&^
? ?
? ?
? ?
? }
? ?
? }
}?
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
namespace WindowsApplication1
{
? public partial class Form1 : Form
? {
? ?
? public Form1()
? {
? InitializeComponent();
? }
? ?
? private void button1_Click(object sender, EventArgs e)
? {
? ?
? System.Data.DataTable table = new DataTable();
? //計算常量,可以沒有初始化列
? object test = table.Compute("1+1", "");
? Console.WriteLine(test);
? //test=2;
? test = table.Compute("1+1", "false");
? Console.WriteLine(test);
? //test=2;常數(shù)計算和filter無關(guān)
? test = table.Compute("abs(1)", "");
? Console.WriteLine(test);
? //test=null,不知道為這個什么沒有抱錯,而且返回null,其他的數(shù)學函數(shù)都會抱錯
? test = table.Compute("2%2", "");
? Console.WriteLine(test);
? //test=0;
? //其他函數(shù)參考下面的計算列
? //初始化datatale
? table.Columns.Add("id", typeof(string));
? table.Columns.Add("value", typeof(int));
? for (int i = 1; i <= 10; i++)
? {
? System.Data.DataRow dRow = table.NewRow();
? dRow["id"] = "id"+i.ToString();
? dRow["value"] = i;
? table.Rows.Add(dRow);
? }
? ?
? //test = table.Compute("value+1", "true");
? 拋出異常,這里必須是聚合函數(shù)
? //*************************************支持的聚合函數(shù)**********************//
? ?
? //求數(shù)量
? test = table.Compute("count(id)", "false");
? Console.WriteLine(test);?
? //test=0;
? test = table.Compute("count(id)", "true");
? Console.WriteLine(test);?
? //test=10;
? //求和
? test = table.Compute("sum(value)", "");
? Console.WriteLine(test);
? //test=55;
? //test = table.Compute("sum(id)","");
? 拋出異常,這里不能是string
? ?
? //平均
? test = table.Compute("avg(value)", "");
? Console.WriteLine(test);
? //test=5;
? //最小
? test = table.Compute("min(value)", "");
? Console.WriteLine(test);
? //test=1;
? //最大
? test = table.Compute("max(value)", "");
? Console.WriteLine(test);
? //test=10;
? //統(tǒng)計標準偏差
? test = table.Compute("StDev(value)", "");
? Console.WriteLine(test);
? //test=3.02765035409749
? //統(tǒng)計方差
? test = table.Compute("Var(value)", "");
? Console.WriteLine(test);
? //test=9.16666666666667
? //復(fù)雜計算
? test = table.Compute("max(value)/sum(value)", "");
? Console.WriteLine(test);
? //test=0.181818181818182
?
? /*******************************************計算列*************************/
? System.Data.DataColumn column = new DataColumn("exp1",typeof(float));
? table.Columns.Add(column);
? //簡單計算
? column.Expression = "value*2";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2;
? //字符串函數(shù)
? column.Expression = "len(id)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=3;
? //字符串函數(shù)
? column.Expression = "len(' '+id+' ')";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=5;
? //字符串函數(shù)
? column.Expression = "len(trim(' '+id+' '))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=3;
? //字符串函數(shù)
? column.Expression = "substring(id,3,len(id)-2)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1; //substring的起始字符位置為1不是0
? //類型轉(zhuǎn)換
? column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1.6;
? //相當于sqlserver的isnull
? column.Expression = "isnull(value,10)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1;
? //三元運算符,相當于sqlserver的case when
? column.Expression = "iif(value>5,1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2000;
? //like運算符
? column.Expression = "iif(id like '%1',1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=1000;
? //in運算符
? column.Expression = "iif(id not in('id1'),1000,2000)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=2000;
? //嵌套的三元運算
? column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=4000;
? //客戶端計算所占總數(shù)的百分比
? column.Expression = "value/sum(value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=0.01818182?
? //客戶端計算差值,比如nba常規(guī)賽的勝場差
? column.Expression = "max(value)-value";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=9
? ?
? //***********************父子表計算*************************************/
? //初始化子表,父子表關(guān)系
? DataTable tableChild = new DataTable();
? ?
? tableChild.Columns.Add("id", typeof(string));
? tableChild.Columns.Add("value", typeof(int));
? System.Data.DataSet ds = new DataSet();
? ds.Tables.Add(tableChild);
? ds.Tables.Add(table);
? DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);
? ds.Relations.Add(relation);
? for (int i = 1; i <= 10; i++)
? {
? System.Data.DataRow dRow = tableChild.NewRow();
? dRow["id"] = "id1";
? dRow["value"] = i;
? tableChild.Rows.Add(dRow);
? }
? //計算子表記錄數(shù)
? column.Expression = "count(child(relation).value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=10;
? ?
? //計算父子表的百分比
? column.Expression = "value/sum(child(relation).value)";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=0.01818182;
? //計算父子表的差值,比如父表為庫存數(shù)量,子表為訂購數(shù)量,計算得出需要補充的數(shù)量
? column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";
? test = table.Select("id='id1'")[0]["exp1"];
? Console.WriteLine(test);
? //test=-54;
? //比較遺憾的是沒有發(fā)現(xiàn)能夠計算同比和環(huán)比的方法,而且計算列無法作為約束
? //************結(jié)束,DataTable可以讓你盡量發(fā)揮聰明才智來減少繁雜的sql語句并且減輕服務(wù)器計算符合^&^
? ?
? ?
? ?
? }
? ?
? }
}?
轉(zhuǎn)載于:https://www.cnblogs.com/guojingyang/archive/2008/11/27/1342299.html
總結(jié)
以上是生活随笔為你收集整理的DataTable的计算功能(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送检9款热卖橄榄油:竟全部翻车
- 下一篇: 期待N年 天才级的全画幅CMOS终于要大