Преобразовать существующий фрагмент кода для использования Array.ForEach - PullRequest
0 голосов
/ 28 января 2009

Мы знаем, что если у вас есть:

var aa = new [] { 1, 2, 3, 4, 5 };
for (int i = 0; i < aa.length; ++i)
{
    aa[i] = aa[i] + 1;
}

это действительно

var aa = new [] { 1, 2, 3, 4, 5 };
Arrary.ForEach(aa, a => a + 1);

Однако, что если бы у меня было это:

var aa = new [] { 1, 2, 3, 4, 5 };
var ab = new [] { 1, 2, 3, 4, 5 };
for (int i = 0; i < aa.length; ++i)
{
    aa[i] = ab[i] + 1;
}

Могу ли я преобразовать это, чтобы использовать только один Array.ForEach? Или, как бы вы это сделали, если хотите свести с ума все функциональные программы? Неуклюжие петли выглядят ужасно.

Ответы [ 6 ]

4 голосов
/ 28 января 2009

Как насчет:

aa = ab.ConvertAll(x => x+1);
2 голосов
/ 28 января 2009

Еще один похожий подход:

Enumerable.Range(0, ab.Length).Select(i => aa[i] = ab[i] + 1);
// Will not work if aa.Length != ab.Length
2 голосов
/ 28 января 2009

Это не красиво, но это будет работать (используя перегрузку Select (), которая возвращает индекс элемента):

var aa = new[] { 1, 2, 3, 4, 5 };
var ab = new[] { 1, 2, 3, 4, 5 };

Array.ForEach(
    aa.Select((x, i) => i).ToArray(),
    i => aa[i] = ab[i] + 1);

ИМХО, простые "for" циклы намного легче понять в этом случае.

1 голос
/ 28 января 2009

Это не будет быстро, но это может сработать

var aa = new [] { 1, 2, 3, 4, 5 };
var ab = new [] { 1, 2, 3, 4, 5 };
Array.ForEach(aa, new Action(a => ab[Array.IndexOf(a)] + 1));

К сожалению, это не будет работать для массива с дублирующимися элементами.

0 голосов
/ 21 июля 2009
var aa = new[] { 1, 2, 3, 4, 5 };
var ab = new[] { 1, 2, 3, 4, 5 };

var index = 0;
Array.ForEach(aa, a => { aa[index] = ab[index] + 1; index++; });

Это не сработает? Это 1 Array.ForEach с индексатором, хранящимся вне Array.ForEach.

0 голосов
/ 03 февраля 2009

Не прямой ответ, но вы хотите ForEach2, который перебирает две последовательности / массива. К сожалению, это не входит в BCL, поэтому вам придется добавить его.

Но если вы пытаетесь сделать функционал в C #, у вас, вероятно, все равно будет вспомогательная библиотека, так что это не так уж сложно.

...