联合两个集合,但仅适用于具有匹配id的对象

时间:2014-02-20 18:12:23

标签: c# linq c#-4.0 collections

首先,如果这是一个明显的重复道歉,我搜索了所有可能产生结果的短语,但很难找到答案/连贯地构建我的搜索词。

我有一个集合1和一个对象A的集合2。

// Object A Structure
Date
Type
Value

集合1涵盖2种类型的日期1到2,集合2涵盖1种类型的日期3到4:

// Collection 1
[0] = 1st, TypeA, 3
[1] = 2nd, TypeA, 3
[2] = 1st, TypeB, 57
[3] = 2nd, TypeB, 57

// Collection 2
[0] = 3rd, TypeB, 57
[1] = 4th, TypeB, 58

我最初的要求是将这两个集合结合起来。不是问题:

var result = collection1.Union(collection2);

但是,我现在希望将两个集合组合在一起,但排除集合1中集合2中不存在Type的对象:

// Result Collection
[0] = 1st, TypeB, 57
[1] = 2nd, TypeB, 57
[2] = 3rd, TypeB, 57
[3] = 4th, TypeB, 58

我确信这是一个简单的(希望是linq)单线解决方案,但我无法让我的大脑知道它是什么。

我到目前为止最好的(两条线)是:

// Get distinct Types from Collection 2
var typesToInclude = collection2.GroupBy(c => c.Type).Select(group => group.First().Type);

var result = collection2.Union(collection1.Where(c => typesToInclude.Contains(c.Type)));

但这感觉非常笨重而不是最佳:(

1 个答案:

答案 0 :(得分:7)

尝试以下

var result = collection1
  .Where(x => collection2.Any(c => c.Type == x.Type))
  .Union(collection2);

基本上首先过滤collection1向下到Typecollection2值的项目,然后运行联合操作