在循环中使用委托传递引用问题
Pass by reference issue using a delegate inside a loop
我有以下代码创建 returns 一个 Dictionary<int, List<string>>
private static readonly Random rnd = new Random();
private static Dictionary<int, List<string>> GenerateValues(string entityType, int rows)
{
var values = new Dictionary<int, List<string>>();
var baseValues = new List<string> { "99 Hellesdon Road","Home","Norfolk","NR6 5EG","Norwich" };
Action<int> rowLoop = null;
switch (entityType)
{
case "Employer":
rowLoop = (row) =>
{
var employer = new List<string>
{
$"Employer {rnd.Next(10000, 99999)}",
$"{rnd.Next(100000000, 999999999)}",
"TRUE"
};
var rowValue = baseValues;
rowValue.AddRange(employer);
values.Add(row, rowValue);
};
break;
case "AssessmentCentre":
rowLoop = (row) =>
{
var rowValue = baseValues;
rowValue.Add($"Assessment Centre {rnd.Next(10000, 99999)}");
values.Add(row, rowValue);
};
break;
}
for (int i = 1; i <= rows; i++)
{
rowLoop(i);
}
return values;
}
然后用...调用它
var spreadsheetValues = GenerateValues("Employer", 5);
然后代码的目的是将一些基值存储在 List<string>
中,然后根据传递给方法的 entityType
的内容,向这些基值添加一些附加值。然后循环一定数量的行以创建 Dictionary<int, List<string>>
,其中 int
是行号。
我遇到的问题是 baseValues
在 for 循环的每次迭代期间都在更新。我在使用 var rowValue = baseValues;
时没想到会这样
这是集合中最后一项的调试屏幕截图....
我希望 Dictionary<int, List<string>>
中的每个 List<string>
包含 8 个项目,但它会随着每次迭代而增长。
为什么会出现这种情况,我该如何纠正?
您似乎已经在解决问题的轨道上了,但这里有一种解决方法。
你写的地方
var rowValue = baseValues;
你真的只是让 "rowValue" 成为指向 "baseValues" 的指针。要制作副本,您可以这样做:
var rowValue = baseValues.ToList();
我有以下代码创建 returns 一个 Dictionary<int, List<string>>
private static readonly Random rnd = new Random();
private static Dictionary<int, List<string>> GenerateValues(string entityType, int rows)
{
var values = new Dictionary<int, List<string>>();
var baseValues = new List<string> { "99 Hellesdon Road","Home","Norfolk","NR6 5EG","Norwich" };
Action<int> rowLoop = null;
switch (entityType)
{
case "Employer":
rowLoop = (row) =>
{
var employer = new List<string>
{
$"Employer {rnd.Next(10000, 99999)}",
$"{rnd.Next(100000000, 999999999)}",
"TRUE"
};
var rowValue = baseValues;
rowValue.AddRange(employer);
values.Add(row, rowValue);
};
break;
case "AssessmentCentre":
rowLoop = (row) =>
{
var rowValue = baseValues;
rowValue.Add($"Assessment Centre {rnd.Next(10000, 99999)}");
values.Add(row, rowValue);
};
break;
}
for (int i = 1; i <= rows; i++)
{
rowLoop(i);
}
return values;
}
然后用...调用它
var spreadsheetValues = GenerateValues("Employer", 5);
然后代码的目的是将一些基值存储在 List<string>
中,然后根据传递给方法的 entityType
的内容,向这些基值添加一些附加值。然后循环一定数量的行以创建 Dictionary<int, List<string>>
,其中 int
是行号。
我遇到的问题是 baseValues
在 for 循环的每次迭代期间都在更新。我在使用 var rowValue = baseValues;
这是集合中最后一项的调试屏幕截图....
我希望 Dictionary<int, List<string>>
中的每个 List<string>
包含 8 个项目,但它会随着每次迭代而增长。
为什么会出现这种情况,我该如何纠正?
您似乎已经在解决问题的轨道上了,但这里有一种解决方法。
你写的地方
var rowValue = baseValues;
你真的只是让 "rowValue" 成为指向 "baseValues" 的指针。要制作副本,您可以这样做:
var rowValue = baseValues.ToList();