2012-09-19 95 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

相关问题