将包含不同类型的两个集合相交

时间:2013-09-03 22:47:11

标签: c# .net linq

假设我有一个集合,称之为ids它的类型为IEnumerable<string>,我有第二个集合称之为objects它的类型为MyObject[]MyObject有一个名为id的字符串属性。我想要一个LINQ语句,它返回objects集合中idids集合中任何值匹配的对象。 ids将是objects.Select(x => x.id)的严格子集。意思是,对于ids中的每个字符串,我知道MyObject中只有一个objects。有人可以发布纯LINQ解决方案吗?我尝试了几件没有运气的事情。我可以轻松地提出一个迭代解决方案,所以除非只有LINQ是不可能的,请不要发布任何内容。

4 个答案:

答案 0 :(得分:7)

“Just”LINQ:

var r = obj.Where(o => ids.Any(id => id == o.id));

但更好的是,对于较大的n,有一组:

var hs = new HashSet(ids);
var r = obj.Where(o => hs.Contains(o.id));

答案 1 :(得分:3)

我认为查询语法非常简单。 它看起来像是:

var a = from o in objects
        join i in ids on o.id equals i
        select o;

答案 2 :(得分:2)

如果您只想要匹配的MyObject列表,您可以执行以下操作:

var solution = objects.Where(x=> ids.Contains(x.id));

相反,您将获得List<T> T其中Id是一个具有2个属性的匿名类型,Obj是一个字符串,用作&#34;键& #34;在此特定情况下,MyObjectvar solution = ids.Select(x=>new{ Id = x, Obj=objects.Where(y=>y.id == x).ToList()}) .ToList(); 列表,其ID与Id属性相对应。

{{1}}

答案 3 :(得分:0)

如果您只是想知道交叉路口是否有任何物体(这正是我所寻找的)

基于此

var a = from o in objects
        join i in ids on o.id equals i
        select o;

你也可以这样做

var isEmpty = objects.Any(x => ids.Any(y => y == x.ToString()));