在循环内添加行

Adding rows inside a loop

如果我执行下面的代码片段:

IXLRange dataRange = worksheet.Range(1, 1, myData.Count, 4);
foreach (var row in dataRange.Rows()) {
    //int cells = row.CellCount();
    if (isEndOfGroup) {
        row.InsertRowsBelow(1);
        var rowBelow = row.RowBelow();
        // Do stuff with the added row, like adding a subtotal
    }
}

这里到底发生了什么?似乎正在迭代的行集合正在更新,这是我想要发生的,因为注释掉的行在下一次迭代时抛出错误 "Range is invalid" 的异常,就好像该行不知何故没有'尚未初始化。

我知道在遍历集合时修改集合是一种不好的做法,但我以前这样做没有任何问题。

实现此目标的替代方法是什么?

永远不要在迭代时修改集合...这是一个出价。 利用 for 循环。 当它之前没有引发异常时,那么您只是更改了行的内容而不是对行本身的引用。

我最终按照 Bagerfahrer 的建议使用了 for 循环,并使用了第二个计数器来跟踪行号:

int rowNum = 1;  // Row numbering starts at 1
for (int i = 0; i < myData.Count; i++) {
    var row = worksheet.Row(rowNum);
    if (isEndOfGroup) {
        row.InsertRowsBelow(1);
        rowNum++;
        var rowBelow = row.RowBelow();
        // Do stuff with the added row, like adding a subtotal
    }
    rowNum++;
}

这让我可以索引到 myData 以检索数据,还可以跟踪我在电子表格中写入的位置。