Архивирование двух списков в C# - PullRequest
1 голос
/ 24 апреля 2020

У меня есть два списка значений Integer:

List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> list2 = new List<int>() { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };

Я хочу сжать два вышеупомянутых списка так, чтобы элементы в четном индексе были получены из суммы соответствующих элементов в Списке 1 и Списке 2 и нечетные элементы получаются умножением их, я пытался сделать что-то вроде этого, но это не сработало:

list1.Zip(list2, index => index % 2 == 0 ? (a, b) => a + b : (a, b) => a * b );

желаемый вывод

{ 12,24,16,56,20,96,24,144,28,200 }

Ответы [ 4 ]

6 голосов
/ 24 апреля 2020

Сначала вы можете Zip, а затем использовать перегрузку Select, включающую индекс.

var result = list1.Zip(list2, (a,b) => (A:a, B:b))
    .Select((x, i) => i % 2 == 0 ? x.A + x.B : x.A * x.B);

Примечание. Здесь я использую кортежи значений, поэтому в зависимости от вашей версии C# вы может потребоваться использовать анонимные классы вместо (a,b) => new { A=a, B=b }

3 голосов
/ 24 апреля 2020
У метода

Zip нет перегрузки, поддерживающей индекс, вместо этого можно использовать библиотеку MoreLinq или метод Select (с селектором элемента, который поддерживает индекс)

var result = list1.Select(
        (value, index) =>
            index % 2 == 0 ? value + list2[index] : value * list2[index])
    .ToList();
result.ForEach(Console.WriteLine);

Это сработает, если оба списка имеют одинаковую длину и даст ожидаемый результат 12, 24, 16, 56, 20, 96, 24, 144, 28, 200

Другой вариант - Zip оба списка в список анонимных объектов, а затем рассчитать сумму против них

var result = list1
    .Zip(list2, (a, b) => new { a, b })
    .Select((value, index) => index % 2 == 0 ? value.a + value.b : value.a * value.b)
    .ToList();
0 голосов
/ 24 апреля 2020

Другой вариант:

int index = 0;
var zipped = list1.Zip(list2, (a, b) => index++ % 2 == 0 ? a + b : a * b);

Кратко, но он использует побочный эффект, что, конечно, плохо.

0 голосов
/ 24 апреля 2020

Используйте .Select() вместо Zip

var result = list1.Select((e, i) =>
                 i % 2 == 0 ?  e + list2[i] : e * list2[i])
                 .ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...