【问题标题】:Why is the loop skipping the last row in my DataTable?为什么循环会跳过我的 DataTable 中的最后一行?
【发布时间】:2012-09-20 02:09:19
【问题描述】:

我有以下代码循环通过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,但不处理 def。

dt2 应包含:

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

其中 8 是 dt 中第 4 列的总数,2 是 abc 行数。

我只是得到这个

abc, 1, 2, 8, 2

【问题讨论】:

  • 定义“进程”,因为您只在 dt2 中获取前两行的行?
  • @JamesMichaelHare - 是的,基本上 dt2 是 dt 的摘要。我会更新我的帖子

标签: c# .net-2.0


【解决方案1】:

那是因为看起来每一行的生成不仅取决于初始表中的行,还取决于初始表中相应行之后的行。最后一行没有“后面的行”。代码被编写成它不会做任何事情(对于最后一行),而不是通过尝试访问不存在的行来崩溃和烧毁。

因此,看看您实际尝试做的事情,我建议您采用类似的解决方案:

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 根据第一列中的值对结果进行分组,然后生成一个新表来适当地聚合每个组的结果。这可能不是您所需要的,但它应该可以帮助您完成大部分工作。

【讨论】:

  • 我想通了,但我不确定如何访问最后一行来处理它。
  • @Xaisoft 那么应该如何处理呢?它没有nextRow 那么结果应该是什么?可能值得提供一个示例输入、程序当前输出的内容以及您希望它输出的内容。
  • 这是我的问题,初始文件有 3 行,在这个例子中,第二个文件应该产生 2 行,但只产生 1。
  • 基本上,我只是将第一列出现的次数相加(在本例中为 abc),一旦在第一列(def)中遇到新值,我将 abc 与它在第二个DataTable中出现的次数,但是一旦它到达def,它就不会把它放在第二个DataTable中。
【解决方案2】:

问题出在这一行:

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

试试改成

if (account != nextAccount) 

我删除了:

nextRow != null

因为这会阻止添加最后一条记录。

我也删除了:

i < dt.Rows.Count

因为您的 for 循环已经强制执行了。

注意:如果帐号与上一行相同,则最后一行可能不会添加。不确定您希望这里的行为是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多