что такое шаблон для изменения коллекции в C # - PullRequest
1 голос
/ 12 марта 2010

Каков шаблон (лучшая практика) для такой проблемы - изменение элементов (значений) в коллекции?

Условия:

  • размер коллекции не изменился (ни один элемент не был удален или добавлен)
  • модификация на месте

В C ++ это было легко и приятно, я просто перебрал коллекцию и изменил элементы. Но в C # повторение (с использованием перечислителя) является операцией только для чтения (если говорить в терминах C ++, доступен только const_iterator).

Итак, как это сделать в C #?

Пример: наличие последовательности модификации «1,2,3,4» изменяет ее на «1, 2, 8, 9», но не «1, 2, 3» или «1, 2, 3, 4 5" .

Ответы [ 2 ]

5 голосов
/ 12 марта 2010

Как правило, вместо этого вы идете по индексу:

for (int i = 0; i < foo.Length; i++)
{
    if (ShouldChange(foo[i]))
    {
        foo[i] = GetNewValue(i);
    }
}

Более функциональной альтернативой является создание метода, который возвращает новую коллекцию, которая содержит нужные «измененные» данные - хотя все зависит от того, что вы хотите сделать.

1 голос
/ 12 марта 2010

На самом деле это зависит. Часть только для чтения относится к самому итератору. Если вы выполняете итерацию коллекции объектов, вы можете изменить состояние объектов с помощью ссылки.

Для коллекции типов значений вы не можете изменять элементы во время итерации, но в этом случае вы можете проходить через элементы, используя обычный цикл и индексатор.

...