Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 局部函数和共享变量的奇怪行为_C#_Aspose_Aspose Cells - Fatal编程技术网

C# 局部函数和共享变量的奇怪行为

C# 局部函数和共享变量的奇怪行为,c#,aspose,aspose-cells,C#,Aspose,Aspose Cells,我正在为预算生成一个Excel文件,本地函数有一个奇怪的行为。问题似乎出在共享变量rowIndex上。出于某种原因,合计公式会覆盖每个部分第一个单元格的内容,但“合计活动”标签不会覆盖帐户名称。有人能解释是什么导致了这种奇怪的行为吗 代码: private void导出() { var workbook=new Aspose.Cells.workbook(); var工作表=工作簿。工作表[0]; int rowIndex=0; var数=0; var数据=新列表 { 新{Name=$“Acc

我正在为预算生成一个Excel文件,本地函数有一个奇怪的行为。问题似乎出在共享变量
rowIndex
上。出于某种原因,合计公式会覆盖每个部分第一个单元格的内容,但“合计活动”标签不会覆盖帐户名称。有人能解释是什么导致了这种奇怪的行为吗

代码:

private void导出()
{
var workbook=new Aspose.Cells.workbook();
var工作表=工作簿。工作表[0];
int rowIndex=0;
var数=0;
var数据=新列表
{
新{Name=$“Account{++number}”,Amount=50,IsIncome=true,Active=true},
新{Name=$“Account{++number}”,Amount=25,IsIncome=true,Active=false},
新{Name=$“Account{++number}”,Amount=75,IsIncome=false,Active=true},
新{Name=$“Account{++number}”,金额=100,IsIncome=false,Active=false},
新{Name=$“Account{++number}”,Amount=60,IsIncome=true,Active=false},
新{Name=$“Account{++number}”,Amount=90,IsIncome=false,Active=true},
新{Name=$“Account{++number}”,Amount=40,IsIncome=true,Active=true},
新{Name=$“Account{++number}”,金额=20,IsIncome=false,Active=false}
};
WriteExportSection(“收入”,data.Where(i=>i.IsIncome.ToList());
WriteExportSection(“费用”,data.Where(i=>!i.IsIncome.ToList());
工作簿.Save(“budget.xlsx”);
IEnumerable WriteRowValues(IList项)
{
foreach(项目中的var项目)
{
工作表.Cells[rowIndex,0]。值=项。名称;
工作表.Cells[rowIndex,1]。值=项。金额;
工作表.Cells[rowIndex,2].Value=item.Active;
如果(项目激活)
{
收益率指数;
}
rowIndex++;
}
}
void WriteExportSection(字符串名称,IList项)
{
工作表。单元格[rowIndex,0]。值=名称;
rowIndex++;
工作表。单元格[rowIndex,0]。Value=“Account”;
工作表。单元格[rowIndex,1]。Value=“Amount”;
工作表.Cells[rowIndex,2].Value=“处于活动状态”;
rowIndex++;
var activeRows=writerowvalue(项目);
rowIndex++;
工作表.Cells[rowIndex,0].Value=“总活动”;
worksheet.Cells[rowIndex,1].Formula=“SUM(“+string.Join(“,”,activeRows.Select(r=>worksheet.Cells[r,1].Name))+”;
rowIndex++;
}
}

这是因为
WriteRowValues
正在使用延迟执行。因为它使用的是
yield
,所以在您开始使用以下表达式迭代它之前,它不会执行:

activeRows.Select(r => worksheet.Cells[r, 1].Name))
因此,
rowIndex
变量在您开始输出总行之前不会递增。输出总计的这些行:

worksheet.Cells[rowIndex, 0].Value = "Total active";
worksheet.Cells[rowIndex, 1].Formula = "SUM(" + string.Join(",", activeRows.Select(r => worksheet.Cells[r, 1].Name)) + ")";
仍将
行索引
保留为其原始未加增量的值。即,数据的“第一行”

最简单的修复方法是立即强制执行:

var activeRows = WriteRowValues(items).ToList();
一个更合适的修复方法可能是完全放弃延迟执行,因为您似乎没有利用它,并且它可能会在以后引起问题(例如,如果您最终迭代它两次):

列出WriteRowValues(IList项)
{
var activeIndexes=new List();
foreach(项目中的var项目)
{
工作表.Cells[rowIndex,0]。值=项。名称;
工作表.Cells[rowIndex,1]。值=项。金额;
工作表.Cells[rowIndex,2].Value=item.Active;
如果(项目激活)
{
添加(行索引);
}
rowIndex++;
}
返回活动索引;
}
var activeRows = WriteRowValues(items).ToList();
List<int> WriteRowValues(IList<dynamic> items)
{
    var activeIndexes = new List<int>();
    foreach(var item in items)
    {
        worksheet.Cells[rowIndex, 0].Value = item.Name;
        worksheet.Cells[rowIndex, 1].Value = item.Amount;
        worksheet.Cells[rowIndex, 2].Value = item.Active;
        if (item.Active)
        {
            activeIndexes.Add(rowIndex);
        }
        rowIndex++;
    }
    return activeIndexes;
}