2010-10-20 2 views
2

Мне нужно получить все элементы из двух списков, содержащих заданное значение.Нужна помощь при объединении двух сборок данных

Пример:

var list1 = { 
    new Dummy(){ Name = "Dummy1", Number = 1 }, 
    new Dummy(){ Name = "Dummy2", Number = 2 }, 
    new Dummy(){ Name = "Dummy3", Number = 3 } 
}; 

var list2 = { 
    new Dummy(){ Name = "Dummy4", Number = 4 }, 
    new Dummy(){ Name = "Dummy5", Number = 2 }, 
    new Dummy(){ Name = "Dummy6", Number = 6 } 
}; 

var list3 = GetAllDummiesWithNumbersContainedInBothLists(); 

Я хочу, чтобы содержать песни3 Dummy2 и Dummy5, поскольку оба имеют один и тот же номер.

Как это сделать? Это должно быть просто, но я не могу это понять ...

+0

Большой ресурс для ссылок LINQ ... Http: //msdn.microsoft.com/en-us/vcsharp/aa336746.aspx –

ответ

1

Я не совсем уверен, что ваши требования, но что-то вроде этого возможно?

var commonIds = list1.Select(d => d.Number) 
        .Intersect(list2.Select(d => d.Number)); 

var commonIdsSet = new HashSet<int>(commonIds); 

var list3 = list1.Concat(list2) 
       .Where(d => commonIdsSet.Contains(d.Number)) 
       .ToList(); 

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

1
var list3 = list1.Where(d => list2.Select(d2 => d2.Number).Contains(d.Number)) 
    .Union(list2.Where(d2 => list1.Select(d => d.Number).Contains(d2.Number))); 
+0

Не совсем. Это возвращает 'bool'. –

+0

@ Амад - Да. У меня было два разных ответа, объединенных вместе, и я забыл изменить последний бит. Готово. –

+0

@Ani - Да, было бы. Нужно объединить результаты, смотрящие в другую сторону. –

2

Смотрите, если это работает для вас:

(from dummy1 in list1 
join dummy2 in list2 on dummy1.Number equals dummy2.Number 
from dummy in new[] { dummy1, dummy2 } 
select dummy) 
.Distinct() 

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

0

Вот еще один!

var list3 = list1 
    .SelectMany(x => list2 
    .SelectMany(y => 
    (y.Number == x.Number) ? new [] { x, y } : new Dummy[]{} 
    ) 
); 
+0

Я свободно признаю, это, вероятно, не самый лучший, но Джастин опубликовал мой первоначальный ответ, поэтому я почувствовал себя вынужденным открыть другой путь! – diceguyd30

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