Непонятные понятия - PullRequest
1 голос
/ 15 марта 2020
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.

Заранее извините, если вопрос глуп, но все же мне нужно очистить мои сомнения.

1 Ответ

5 голосов
/ 15 марта 2020

Когда вы делаете это:

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<T> типов значений (таких как int). Если вы работали с элементами ссылочного типа, то изменения свойств элементов в s1111 будут отражены в элементах qu[index], потому что, опять же, каждый элемент является просто ссылкой на оригинал. Просто что-то иметь в виду, когда вы продвигаетесь вперед.

...