項目中遇到計算平均值、標准偏差、平均值+標准偏差、平均值+2倍標准偏差、平均值+3倍標准偏差、平均值-標准偏差、平均值-2倍標准偏差、平均值-3倍標准偏差,要求提取出共用的方法(數據源可以是excel、csv、文本文件等),為此,想到取出數據再計算相應內容.
public object Compute(string expression,string filter)
- expression:要計算的表達式,參數需要時聚合函數。
- filter:要限制在表達式中進行計算的行的篩選器
- object:計算結果
- 舉例如下:

1 using (OracleConnection con = new OracleConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString())) 2 { 3 con.Open(); 4 OracleCommand cmd = con.CreateCommand(); 5 cmd.CommandText = "SELECT * FROM EMP"; 6 OracleDataAdapter oda = new OracleDataAdapter(cmd); 7 DataSet ds = new DataSet(); 8 oda.Fill(ds); 9 DataTable dt = ds.Tables[0]; 10 //求和 11 string sum = Math.Round(Convert.ToDouble(dt.Compute("sum(sal)", "")), 2).ToString(); 12 //求平均 13 string avg = Math.Round(Convert.ToDouble(dt.Compute("avg(sal)", "")), 2).ToString(); 14 //具有篩選條件 求和 15 string sumFilter = Math.Round(Convert.ToDouble(dt.Compute("sum(sal)", "SAL<3000")), 2).ToString(); 16 //具有篩選條件 求平均 17 string avgFilter = Math.Round(Convert.ToDouble(dt.Compute("avg(sal)", "SAL<3000")), 2).ToString(); 18 //標准偏差 19 string stDev = Math.Round(Convert.ToDouble(dt.Compute("stdev(sal)", "")), 2).ToString(); 20 //具有篩選條件標准偏差 21 string stDevFilter = Math.Round(Convert.ToDouble(dt.Compute("stdev(sal)", "sal<3000")), 2).ToString(); 22 //最小值 23 string min = dt.Compute("min(sal)", "").ToString(); 24 //具有篩選條件的最小值 25 string minFiter = dt.Compute("min(sal)", "sal<3000").ToString(); 26 //平均值+標准偏差 27 string avgStDev = Math.Round(Convert.ToDouble(dt.Compute("avg(sal)+stdev(sal)", "")), 2).ToString(); 28 dt.Columns.Add("cl", typeof(string),"len(ename)"); 29 StringBuilder sb = new StringBuilder(); 30 sb.Append("求和:" + sum + "<br/>"); 31 sb.Append("求平均:" + avg + "<br/>"); 32 sb.Append("標准偏差:" + stDev + "<br/>"); 33 sb.Append("最小值:" + min + "<br/>"); 34 sb.Append("具有篩選條件求和:"+sumFilter+"<br/>"); 35 sb.Append("具有篩選條件求平均:"+avgFilter+"<br/>"); 36 sb.Append("具有篩選條件標准偏差:"+stDevFilter+"<br/>"); 37 sb.Append("具有篩選條件的最小值:"+minFiter+"<br/>"); 38 sb.Append("平均值+標准偏差:"+avgStDev+"<br/>"); 39 lbShow.Text = sb.ToString(); 40 }