Нужна помощь в объединении двух сборов данных - PullRequest
2 голосов
/ 20 октября 2010

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

Пример:

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();

Я хочу, чтобы list3 содержал Dummy2 и Dummy5 , так как у обоих одинаковые номера.

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

Ответы [ 4 ]

2 голосов
/ 20 октября 2010

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

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

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

1 голос
/ 20 октября 2010

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

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 голос
/ 20 октября 2010
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 голосов
/ 20 октября 2010

Вот еще один!

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