我有两个列表(例如):
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
答案 0 :(得分:10)
var newList = OldIDs.Intersect(NewIDs).ToList();
如果OldIDs
包含具有Id
属性的自定义对象:
var newList = OldIDs.Where(x => NewIDs.Contains(x.Id)).ToList();
使用Join
的另一种方式more efficient:
var oldInNew = from old in OldIDs
join newID in NewIDs
on old.Id equals newID
select old;
var newList = oldInNew.ToList();
答案 1 :(得分:1)
您想使用Intersect()
,请尝试以下操作:
var intersectedList = NewIDs.Intersect(OldIDs).ToList();