我需要从包含给定值的两个列表中检索所有项目。
示例:
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 ,因为两者都有相同的数字。
我该怎么做?它应该很简单,但我无法弄清楚......
答案 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[]{}
)
);