在循环中使用委托传递引用问题

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();