2015-09-11 2 views
-2

У меня есть два списка из тех же сложных объектов, но каждый список имеет разные данные для объектов.Создать новый список объектов из двух разных списков

Мне нужно получить новый набор списков тех же сложных объектов, но объединить их для подсчета меньших объектов. Я не знаю, как это сделать. Я попытался понять, как объединить их, добавить addrange и попытаться использовать словари вместо этого, но это немного сложнее, чем все, что я делал раньше. Я нашел похожие ответы, но ни один из них для моего конкретного сценария.

Вот лучший способ, которым я могу попробовать из кода:

List<Object1> ListA; 
List<Object1> ListB; 

ListA.count() = 5 
ListB.count() = 3 

new List<Object1> Object1CombinedList; 

1. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB)) 
2. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB)) 
3. List<Object1> Object1CombinedList (Object1 (from listA), Object1 (from ListB)) 
4. List<Object1> Object1CombinedList (Object1 (from listA), null)) 
5. List<Object1> Object1CombinedList (Object1 (from listA), null)) 

Я думал как-то зацикливание через два независимых списков, чтобы объединить их для каждой пары, как он шел. (Я думал, что смогу сделать это со словарями, но не смог заставить его работать). Конечный результат: мне нужен новый набор списков (опять же все те же сложные объекты), равный счету длины самого длинного из двух списков.

Новый набор должен содержать согласованные пары из списка A и списка B до тех пор, пока не будет исчерпан меньший из двух наборов, но все же будет содержать один сложный объект для остальной части более длинного списка.

Пять списков, показанных выше, являются примером того, что мне нужно, чтобы выйти из двух исходных списков источников. (с образцом их данных).

Надеюсь, что это имеет смысл? Спрашивая это наилучшим образом, я могу.

+0

Должен ли он быть 'List <Список >' (где внутренний список содержит ровно 2 элемента)? Может ли это быть «List >» вместо этого? – dcastro

+0

Непонятно, что вы спрашиваете. Вы хотите 5 новых списков? – Jamiec

+0

Мне нужно, чтобы это был набор объектов списка, но мне все равно, если он начинается как словарь или что-то еще в первую очередь. – numlaar

ответ

2

Ваш вопрос немного неясен, но я считаю, что вы хотите использовать метод ZipAll. Псевдо код:

var listA = {1, 2, 3, 4} 
var listB = {a, b, c} 

ZipAll(listA, listB) == {(1, a), (2, b), (3, c), (4, null)} 

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

ISequence<Tuple<Object1, Object1>> zipped = listA.AsSequence().ZipAll(listB, null, null); 
+0

Спасибо, я постараюсь изучить это еще и посмотреть, поможет ли это. Я не могу добавить внешнюю библиотеку, но спасибо за внимание. Я задал вопрос наилучшим образом, я мог ... Я попытался оставить вас + на обратной связи, но так как я был проголосован за этот вопрос, это не применимо. – numlaar

+0

@numlaar Если вы не можете/не хотите зависеть от библиотеки для одного метода, вместо этого используйте [эту реализацию] (http://stackoverflow.com/a/18707896/857807). – dcastro

+0

@numlaar Это нормально. Это еще не слишком поздно, чтобы улучшить/перефразировать ваш вопрос, хотя :) – dcastro

1

Отказ от ответственности: Я пишу это, как @dcastro комментировал. Я использовал подобную идею метода ZipAll, но нашел из here


Что вы после застегнуть оба списка вместе, образуя новый список по пути.К сожалению, встроенный в Zip метод останавливается, когда один из списков завершения, поэтому реализация которых не делает так это то, что вам нужно - обычно называют ZipAll - можно найти here

Тогда это становится довольно простым:

var listA = new List<string>(){"a1","a2","a3","a4","a5"}; 
var listB = new List<string>(){"b1","b2","b3"}; 

var combined = listA.ZipAll(listB, (a,b) => new List<string>(){a,b}).ToList(); 
for(var i=0;i<combined.Count;i++) 
{ 
    Console.WriteLine("{0}: {1} | {2}",i,combined[i][0],combined[i][1]); 
} 

выход

0: a1 | b1 
1: a2 | b2 
2: a3 | b3 
3: a4 | 
4: a5 | 

Живой пример: http://rextester.com/PULLI83949

+0

Отлично! Это именно то, что мне нужно. Спасибо!! – numlaar

-2

Что об этом

  List<int> A = new List<int>() { 1, 2, 3 }; 
      List<int> B = new List<int>() { 1, 2, 3, 4 }; 

      List<int> C = A.Count > B.Count ? A : B;​ 
+0

Это просто возвращает более крупный список. Это не то, чего хочет OP. – dcastro

+0

Читать комментарии: Да, мне нужно 5 новых списков (максимальное количество самого длинного списка). – jdweng

+0

Точно, ему нужен набор из 5 списков. Ваш код возвращает 1 список. Прочтите мои ответы и ответы Джамека, чтобы понять, что ищет ОП (предоставлено, вопрос был несколько загадочным). – dcastro

Смежные вопросы