【问题标题】:Unclear concepts不清楚的概念
【发布时间】:2020-03-14 22:52:19
【问题描述】:
public static List<int> dynamicArray(int n, List<List<int>> qu)
        {
            List<int> ls1 = new List<int>();
            int lastAnswer = 0;
            foreach (List<int> ls in qu)
            {
                int index = (ls[1] ^ lastAnswer) % n;

                if (ls[0] == 1)
                {
                    List<int> s1111 = qu[index];

                    s1111.Add(ls[2]);
                }
                else
                {
                    List<int> s1111 = qu[index];

                    int ind = ls[2] % s1111.Count;
                    lastAnswer = s1111[ind];
                    ls1.Add(lastAnswer);

                }
            }
            return ls1;
        }

在调试时我发现 qu 列表值正在发生变化,我很困惑为什么会发生这种情况,因为我没有在任何地方更改 qu 的值。

如果问题很愚蠢,请提前抱歉,但我仍然需要清除我的疑问。

【问题讨论】:

    标签: c# debugging logic


    【解决方案1】:

    当你这样做时:

    List<int> s1111 = qu[index];
    

    ...你没有得到qu[index] 的副本(或克隆),你得到的是对它的引用。

    所以这个:

    s1111.Add(ls[2]);

    ...就像你这样做一样:

    qu[index].Add(ls[2]);

    如果您想对克隆进行操作,并保持 qu 不变,您可以这样做:

    List<int> s1111 = qu[index].ToList();
    

    或者这个:

    List<int> s1111 = new List<int>(qu[index]);
    

    ...但请理解,对于 List&lt;T&gt; 的值类型(例如 int),这两者都将按预期工作。如果您使用的是引用类型元素,那么s1111 中元素属性的更改将反映在qu[index] 的元素中,因为每个元素都只是对原始元素的引用。只是在您前进时要牢记。

    【讨论】:

    • 感谢您的澄清。
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多