5

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

4

4 回答 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 回答