2012-09-19 94 views
2

我有以下代碼循環通過DataTable並建立另一個如果滿足某些條件。但是,最初的DataTable中的最後一行將被跳過。爲什麼循環跳過我的DataTable中的最後一行?

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    DataRow row = dt.Rows[i]; 
    DataRow nextRow = i < dt.Rows.Count - 1 ? dt.Rows[i + 1] : null; 

    string account = row[1].ToString(); 
    string nextAccount = ""; 
    if (nextRow != null) 
    { 
     nextAccount = nextRow[1].ToString(); 
    } 

    numberOfItems++; 
    totalAmount += Convert.ToDecimal(row[2]); 
    row[4] = "D"; 
    row[5] = c; 
    row[6] = Sequence; 


    if (nextRow != null && i < dt.Rows.Count && account != nextAccount) 
    { 
     dt2.Rows.Add("N", 
      c, 
      row[1], 
      row[2], 
      row[3], 
      numberOfItems, 
      totalAmount, 
      Sequence); 

     numberOfItems = 0; 
     totalAmount = 0m; 
     Sequence++; 
    } 

} 

在上面的代碼,如果我有一個表,如:

abc, 1, 2, 3 
abc, 1, 2, 5 
def, 1, 3, 6

它會同時處理ABC的,但不是高清。

DT2應包含:

abc, 1, 2, 8, 2 
def, 1, 3, 6, 1

凡8是總的第4列中dt和2爲abc的行數。

我只得到這雖然

abc, 1, 2, 8, 2
+0

定義「process」,因爲在前兩行中只有dt2中有行嗎? –

+0

@JamesMichaelHare - 是的,基本上dt2是dt的總結。我會更新我的帖子 – Xaisoft

回答

1

問題是這一行:

if (nextRow != null && i < dt.Rows.Count && account != nextAccount) 

嘗試將其更改爲

if (account != nextAccount) 

我刪除:

nextRow != null 

因爲禁止添加的最後一個記錄。

我也刪除:

i < dt.Rows.Count 

,因爲這已經被你for循環執行。

注意:如果帳戶與上一行相同,則最後一行仍可能不會添加。不知道你在這裏想要什麼樣的行爲。

2

這是因爲它似乎每行的生成依賴,不僅在初始表中的行,而且在最初的相應行後的行表。最後一行沒有「之後的行」。代碼是這樣編寫的,它不會做任何事情(對於最後一行),而不是通過嘗試訪問不存在的行來崩潰和刻錄。

所以看着你實際上試圖做的,我建議適應類似這樣的解決方案:

foreach (var group in dt.AsEnumerable() 
    .GroupBy(row => row[0])) 
{ 
    DataRow firstInGroup = group.First(); 
    dt2.Rows.Add(
     firstInGroup[0], 
     firstInGroup[1], 
     firstInGroup[2], 
     group.Sum(row => row[3] as decimal?)); 
} 

您可以使用GroupBy到組中的第一列基於價值的結果,然後生成一個新的表格,適當地彙總每個組的結果。有可能這不會是你所需要的,但它應該能讓你獲得大部分的途徑。

+0

我想,但我不知道如何訪問最後一行來處理它。 – Xaisoft

+1

@ Xaisoft那麼,它應該如何處理?它沒有'nextRow',所以結果應該是什麼?可能值得提供一個示例輸入,程序當前輸出的內容以及您希望輸出的內容。 – Servy

+0

這是在我的問題,最初的文件有3行,在這個例子中,第二個文件應該產生2行,但只產生1. – Xaisoft

相關問題