C#中的LINQ。检查一个列表是否包含另一个列表的元素

3

我有两个列表(例如):

var NewIDs = new List<string>();
NewIDs.AddRange(...some values...);

var OldIDs = new List<some type>()
OldIDs.AddRange(...some values...);

我需要返回OldIDs列表,其中只包含第一个列表中的值。我是这样做的:

var newList = OldIDs.Where(p => p.Id.All(x => NewIDs.Contains(x.ToString()))).ToList();

但它返回 count=0;

编辑1: NewIDs仅为字符串列表,而OldIDs是一些结构,其具有Id属性

编辑2: 它的工作方式如下:

var newList = new List<MyType>();
 foreach (var res in NewIDs)
   {
     newList.AddRange(OldIDs.Where(a => a.Id == res));
   }

我需要重写它,不使用foreach,只使用LINQ

2个回答

11
使用 Enumerable.Intersect 方法:
var newList = OldIDs.Intersect(NewIDs).ToList();

如果OldIDs包含具有Id属性的自定义对象:
var newList = OldIDs.Where(x => NewIDs.Contains(x.Id)).ToList();

使用 Join 的另一种可能更高效的方法:

var oldInNew = from old in OldIDs
               join newID in NewIDs 
               on old.Id equals newID
               select old;
var newList = oldInNew.ToList();

第二个变量也返回count=0。NewIDs只是字符串列表,但OldIDs是一些结构,其中有一个Id属性。 - Mia
@coderman:那么OldIDs中不包含Id包含在NewIDs中的对象。 - Tim Schmelter
请您检查一下 EDIT 2,谢谢。 - Mia
@coderman:EDIT 2代码不同。如果“NewIDs”中的ID重复,它将添加重复对象。它也不太有效率。但除此之外,两者都应该可以工作。您能否展示一下类和一些显示问题的示例数据?我已经添加了另一种更有效率的方法。 - Tim Schmelter

2
您想使用Intersect(),请尝试以下方法:
var intersectedList = NewIDs.Intersect(OldIDs).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接