2016-07-07 4 views
3

Если у меня есть класс Ball с set аксессором для своей собственности radius, я могу установить радиус список Ball объектов с использованием foreach цикла :Как изменить значение примитивного переменного типа данных, на который ссылается Еогеасп итератор

foreach(Ball ball in balls) 
{ 
    ball.radius = 1; 
} 

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

foreach(double radius in radii) 
{ 
    radius = 1; 
} 

Я попытался решить ее с указателем, как это:

double* p; 
foreach(double radius in radii) 
{ 
    p = &radius; 
    *p = 1; 
} 

Неудивительно, что это не работает, потому что p относится к адресу занимаемого итератора, а не переменной.


В случае, если это важно здесь, я буду более конкретно о том, что я на самом деле пытается сделать, и хотя я бы до сих пор, как ответ на мой главный вопрос, это вполне возможно, что существует гораздо проще способ сделать это с помощью методов List<>, с которыми я не знаком. У меня есть List<List<double>>, который я хочу изменить каждый элемент, в частности путем деления каждой на константу нормализации normalisationFactor. Следующие работает отлично:

for (int i = 0; i < array.Count; i++) 
{ 
    for (int j = 0; j < array[0].Count; j++) 
    { 
     array[i][j] /= normalisationFactor; 
    } 
} 

Однако, я считаю, что синтаксис foreach гораздо более удобным для чтения, и хотел бы, чтобы это таким образом, если я могу. По причинам, которые я подробно выше, ниже не работает:

foreach (List<double> row in array) 
{ 
    foreach (double value in row) 
    { 
     value /= normalisationFactor; 
    } 
} 

Итак, как же я добиться того, что я хочу, используя foreach цикл?

ответ

7

примитивы (структуры) неизменяемы и передаются как значения не указатели.

IEnumerables не предоставляет средства для обновления данных.

Если вы знаете, подчеркивающий тип данных (Array, Collection, List), только петли индекс позиции и обновления позиции коллекции

for (var i=0; i < radius.Count; i++) 
    radius[i] = newValue 
+0

Хорошо, так это выглядит, как мое решение (в моем предпоследнем блоке кода) является самым простым тогда. Я подожду, чтобы узнать, дает ли кто-нибудь другой ответ, прежде чем принимать его. Приветствия. – BZ1