C#:将项添加到List时,先前的List Item也会被Item覆盖。为什么呢?

时间:2017-03-15 18:37:45

标签: c# list for-loop instantiation insertion-sort

我在C#中实现了插入排序算法。该方法返回List<List<string>>,记录List所经历的所有步骤和更改,已选择的变量等。

以下是方法:

public List<List<int>> SortStepByStep(List<int> set)
{
    List<List<int>> steps = new List<List<int>>();
    steps.Add(set); 

    for (int c1 = 1; c1 < set.Count; c1++)
    {
        Console.WriteLine(steps[0][0].ToString());

        int item = set[c1];

        set.Add(item);
        steps.Add(set);
        set.RemoveAt(set.Count - 1);
        // ^^^^ This is just to visually display what number is being selected.

        set.RemoveAt(c1);

        steps.Add(set); 

        bool inserted = false;
        for (int c2 = 0; c2 < c1; c2++)
        {
            if ((set[c2] > item || c2 == c1 - 1) && !inserted)
            {
                set.Insert((set[c2] <= item && (c2 == c1 - 1) ? c2 + 1 : c2), item);
                steps.Add(set); 
                inserted = true; 
                break;
                // Added the break in anyway because sometimes the inserted boolean failed to work.
            }
        }
    }
    return steps;
}

该方法实际返回的只是“步骤”的每个索引处的最终排序列表。我已经跟着它将“步骤”写入控制台并且可以看到它逐渐变化,但不明白为什么。

其他答案提到在for循环中实例化,但我认为这不适用于此。

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

步骤列表将引用列入同一个集合。因此,一旦修改设置步骤的每个元素都会显示更新的值(它们指向同一个对象)。

尝试将steps.Add(set);更改为steps.Add(set.ToList())steps.Add(new List<int>(set)),这应该创建新列表而不是引用旧列表。