使用循环内的委托传递引用问题

时间:2017-11-08 11:18:05

标签: c# delegates pass-by-reference

我有以下代码创建并返回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是行号。

我遇到的问题是我的for循环的每次迭代都会更新baseValues。使用var rowValue = baseValues;

时,我没有预料到这一点

这是集合中最后一项的调试屏幕截图....

enter image description here

我希望List<string>中的每个Dictionary<int, List<string>>包含8个项目,但每次迭代都会增长。

为什么会发生这种情况,我该如何纠正呢?

1 个答案:

答案 0 :(得分:3)

您似乎已经开始解决问题,但这是解决问题的方法。

你写的地方

var rowValue = baseValues;

你真的只是让“rowValue”指向“baseValues”。要制作副本,您可以执行以下操作:

var rowValue = baseValues.ToList();