假设我有一个集合,称它为ids
type IEnumerable<string>
,我有第二个集合称它为objects
type MyObject[]
。MyObject
有一个名为的字符串属性id
。我想要一个 LINQ 语句,它返回集合中与objects
集合中的id
任何值匹配的所有对象ids
。ids
将是 的严格子集objects.Select(x => x.id)
。ids
意思是,对于我知道的每个字符串,MyObject
在objects
. 有人可以发布纯 LINQ 解决方案吗?我已经尝试了几件事,但没有运气。我可以很容易地想出一个迭代解决方案,所以除非不可能只使用 LINQ,否则请不要发布任何内容。
问问题
3178 次
4 回答
8
“只是” 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));
于 2013-09-03T22:53:32.503 回答
5
我认为这对于查询语法来说非常简单。它看起来像:
var a = from o in objects
join i in ids on o.id equals i
select o;
于 2013-09-03T23:03:06.700 回答
2
如果你只想要一个匹配的 MyObject 列表,你可以这样做:
var solution = objects.Where(x=> ids.Contains(x.id));
取而代之的是,您将获得List<T>
whereT
是具有 2 个属性的 Anonymous 类型,Id
即在此特定情况下用作“键”的字符串,以及id 对应于 Id 属性Obj
的列表。MyObject
var solution = ids.Select(x=>new{ Id = x, Obj=objects.Where(y=>y.id == x).ToList()})
.ToList();
于 2013-09-03T22:50:17.637 回答
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()));
于 2015-05-25T07:08:45.880 回答