Как добавить два списка в Linq, чтобы добавилиList [x] = listOne [x] + listTwo [x]?

Я хочу добавить два списка числового типа так, чтобы addList [x] = listOne [x] + listTwo [x]

Вывод списка должен быть универсальным. использовать в будущих запросах linq.

Хотя я смог сделать это, используя приведенный ниже код, я не могу помочь, но чувствую, что должен быть лучший способ. Есть идеи?

List<int> firstList = new List<int>(new int[] { 1, 3, 4, 2, 5, 7, 2, 5, 7, 8, 9, 0 });
List<int> secondList = new List<int>(new int[] { 4, 6, 8, 3, 1, 5, 9, 3, 0 });

int findex = 0;

ILookup<int, int> flookup = firstList.ToLookup(f =>
                            {
                               int i = findex;
                               findex++; 
                               return i;
                               }, p => p);  

var listsAdded = from grp in flookup
                 select grp.First() + secondList.ElementAtOrDefault(grp.Key);

foreach (int i in listsAdded)
  Console.WriteLine(i);
8
задан Audie 24 March 2010 в 22:19
поделиться

4 ответа

var result = 
   from i in 
        Enumerable.Range(0, Math.Max(firstList.Count, secondList.Count))
   select firstList.ElementAtOrDefault(i) + secondList.ElementAtOrDefault(i);
4
ответ дан 5 December 2019 в 06:23
поделиться

Похоже, вам нужна такая функция:

public static IEnumerable<int> SumIntLists( 
    this IEnumerable<int> first, 
    IEnumerable<int> second) 
{
    using(var enumeratorA = first.GetEnumerator()) 
    using(var enumeratorB = second.GetEnumerator()) 
    { 
        while (enumeratorA.MoveNext()) 
        {
            if (enumeratorB.MoveNext())
                yield return enumeratorA.Current + enumeratorB.Current;
            else
                yield return enumeratorA.Current;
        }
        // should it continue iterating the second list?
        while (enumeratorB.MoveNext())
            yield return enumeratorB.Current;
    } 
} 
3
ответ дан 5 December 2019 в 06:23
поделиться

Вам нужен метод Zip. Этот метод позволяет объединять списки одинаковой длины в один список, применяя проекцию.

Например

var sumList = firstList.Zip(secondList, (x,y) => x + y).ToList();

Этот метод был добавлен в BCL в CLR 4.0 ( Ссылка ). Однако это довольно просто реализовать, и в Интернете доступно множество версий, которые можно скопировать в приложение 2.0 или 3.5.

19
ответ дан 5 December 2019 в 06:23
поделиться
var res = list.Concat(list1); 

объединяет два списка, включая возможные дубликаты.

var res = list.Union(list1);

конкатенирует два списка, получая результат без дубликатов.

0
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: