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