削減

2014-02-26 126 views
1

我有「/」爲例如數據表中的列包含由斜線分隔的一對兩個值(解析/申請中):(10/22)削減

ColumnABC 
--------- 
1/2 
5/8 
1/3 

現在我要計算此列「ColumnABC」的總和爲(7/13)

我想是這樣

string expression = "SUM(" + dt.Columns[i].ColumnName + ")"; 
int sum = Convert.ToInt32(dt.Compute(expression, "")); 

這工作正常包含int類型的所有其他列,但拋出異常,這個「ColumnABC」 : Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.

回答

3

假設你有機會獲得LINQ(即.NET 3.5+):

var tuple = dt.Rows.Cast<DataRow>() 
        .Select(row => row["ColumnABC"].ToString().Split('/')) 
        .Select(strs => new Tuple<int, int>(
         Int32.Parse(strs[0]), 
         Int32.Parse(strs[1]))) 
        .Aggregate((curr, next) => new Tuple<int, int>(
         curr.Item1 + next.Item1, 
         curr.Item2 + next.Item2)); 

var result = String.Format("{0}/{1}", tuple.Item1, tuple.Item2); 
+1

謝謝@decPL!由於列名是動態的,並且是未知的,所以我不得不對你的代碼做一些小的修改: .Select(row => row [dt.Columns [i] .ColumnName] .ToString().Split('/')) – punter

1

「int sum」是沒有意義的。你有一個分數(整數是整數)。我認爲你將不得不遍歷整個值或寫一些非常瘋狂的東西。

 DataTable table = new DataTable(); 
    table.Columns.Add("fraction", typeof(string)); 
    table.Rows.Add("1/2"); 
    table.Rows.Add("5/8"); 
    table.Rows.Add("1/3"); 

    int numerator = 0; 
    int denominator = 0; 
    foreach (DataRow row in table.Rows) 
    { 
     string[] split = row[ 0 ].ToString().Split('/'); 
     numerator += int.Parse(split[ 0 ]); 
     denominator += int.Parse(split[ 1 ]); 
    } 
    MessageBox.Show(numerator + "/" + denominator); 

這也可能更有意義,以將這些值存儲在兩個單獨的列,那麼你可以只得到輕鬆使用標準的SQL每一列的總和。

+0

他希望總結斜線前的所有項目,然後總結斜線後面的所有項目。斜線用作分隔符,而不是分隔符運算符。 – David

+0

好的。那麼,一旦他分開了兩個號碼,他就可以做他想做的任何事情:)但是你提出了一個很好的觀點,所以我會刪除我的關於如何分割這兩個數字的方法。 – Derek

3

首先,承認存在顯然與您的數據源的問題。

最好的辦法是在數據庫中創建一個函數,將這些數據分成兩個字段並返回到您的存儲庫。

如果你不能改變DB模式,那麼就在每個記錄循環,應用功能在你的代碼,以分割的項目,或者是這樣的:

var resolved = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[0]) 
var pending = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[1]) 

無論如何,這是假頂我的頭...

+1

@ decPL的答案是相似的,但更加優雅,並在我之前進入。威士忌和編碼建議!FTW。 – David

+0

我喜歡這兩個答案。你的字符串分裂加倍,但更容易閱讀。 – Derek