【问题标题】:LINQ in C#. Check if one list contains elements from another one [duplicate]C# 中的 LINQ。检查一个列表是否包含另一个列表中的元素[重复]
【发布时间】:2015-02-08 14:19:12
【问题描述】:

我有两个列表(例如):

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    使用Enumerable.Intersect:

    var newList = OldIDs.Intersect(NewIDs).ToList();
    

    如果OldIDs 包含具有Id 属性的自定义对象:

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

    另一种,可能是more efficient 使用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 属性
    • @coderman: 那么OldIDs 不包含Id 包含在NewIDs 中的对象。
    • 请您检查一下EDIT 2
    • @coderman:EDIT 2 代码不一样。如果NewIDs 中的 ID 重复,它将添加重复的对象。它的效率也较低。但除此之外,两者都应该工作。你能展示课程和一些显示问题的示例数据吗?我添加了另一个more efficient 方式。
    【解决方案2】:

    您想使用Intersect(),请尝试以下操作:

    var intersectedList = NewIDs.Intersect(OldIDs).ToList();
    

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多