需要帮助合并两个数据集合

时间:2010-10-20 19:25:00

标签: c# linq lambda union intersection

我需要从包含给定值的两个列表中检索所有项目。

示例:

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 个答案:

答案 0 :(得分: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确保每个虚拟对象只出现一次,即使任一列表包含重复的数字。

答案 1 :(得分: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)));

答案 2 :(得分: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是唯一的等等),我们可以提供更好的解决方案。

答案 3 :(得分:0)

还有一个!

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