c # Array.ForEach альтернатива, которая заменяет элементы - PullRequest
3 голосов
/ 27 марта 2011

Есть ли стандартная функция, которую я могу использовать, которая выполняет итерацию по массиву аналогично ForEach, применяя функцию к каждому элементу и заменяя ее в массиве результатом?После этого в power powers содержатся результаты IntPow (2, i) для каждого элемента.

dimensionPowers = Enumerable.Range(0, dimensions + 1).ToArray();
Array.ForEach(dimensionPowers,
    (i) => IntPow(2, i));

(я знаю, что могу перебирать массив с помощью цикла for - мне просто интересно, есть ли более краткая альтернатива).

Ответы [ 2 ]

9 голосов
/ 27 марта 2011

В документах MSDN говорится, что дизайнеры сознательно не добавили ForEach с массивом из-за того, что: 1) писать тривиально, 2) точно вашу проблему - люди запутаются, будет ли оригиналМассив изменен или нет.

Большинство типов реализации итератора массива ForEach (вам на самом деле нужна функция «map») возвращает новый экземпляр массива.Например, вы можете использовать LINQ:

newArray = dimensionPowers.Select(i => IntPow(2,i)).ToArray();

или лучше:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2,i)).ToArray();

Однако, если вы хотите изменить исходный массив на месте, есть старый добрыйцикл:

for (int i=0; i < dimensionPowers.Length; i++) { dimensionPowers[i] = IntPow(2,i); }

Разработчики для .NET вынуждают вас использовать эти разные методы только для того, чтобы вы знали, когда изменяется массив.

Если вы хотите реализовать свойПоместив модификацию, вы можете создать метод расширения:

static void ForEachModifyInPlace<T> (this Array<T> array, Func<T,T> map_action) {
    for (int i=0; i < array.Length; i++) { array[i] = map_action(array[i]); }
}
0 голосов
/ 27 марта 2011

Я не думаю, что вы можете сделать это гораздо более кратко (используя существующие методы).

Вы можете свернуть два шага в одном:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2, i)).ToArray();
...