LINQ从列表中删除某些元素<基于清单< intt;

本文关键字:于清单 intt 元素 列表 删除 LINQ | 更新日期: 2023-09-27 18:14:18

如何使用LINQ从基于另一个illist的illist中删除某些元素。我需要从列表1中删除记录,其中ID存在于列表2中。下面是代码示例

class DTO
{
    Prop int ID,
    Prop string Name
}
IList<DTO> list1;
IList<int> list2;

foreach(var i in list2)
{
    var matchingRecord = list1.Where(x.ID == i).First();
    list1.Remove(matchingRecord);
}

我就是这么做的,有没有更好的方法呢

LINQ从列表中删除某些元素<基于清单< intt;

您可以为IList<T>编写一个"RemoveAll()"扩展方法,其工作原理与List.RemoveAll()完全相同。(这通常足够有用,可以保存在公共类库中。)

例如(为了清楚起见,删除了错误检查;您需要检查参数是否为null):

public static class IListExt
{
    public static int RemoveAll<T>(this IList<T> list, Predicate<T> match)
    {
        int count = 0;
        for (int i = list.Count - 1; i >= 0; i--)
        {
            if (match(list[i]))
            {
                ++count;
                list.RemoveAt(i);
            }
        }
        return count;
    }        

然后根据需要从list1中删除项目确实变得非常简单:

list1.RemoveAll(item => list2.Contains(item.ID));

我会使用这种方法:

var itemsToRemove = list1.Where(x => list2.Contains(x.ID)).ToList();
foreach(var itemToRemove in itemsToRemove)
    list1.Remove(itemToRemove);

此方法删除了适当的项。适用于list1项多、list2项少的情况。
如果list1list2中的项目数量相似,那么邝乐的方法是一个很好的选择。

您可以使用Where更简单:

list1 = list1.Where(x => !list2.Contains(x.ID))
             .ToList();

但你真的需要删除的地方,更喜欢@DanielHilgarth的答案