10

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

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);
}

这就是我的做法,有没有更好的方法来做同样的事情。

4

3 回答 3

20

You could write a "RemoveAll()" extension method for IList<T> which works exactly like List.RemoveAll(). (This is generally useful enough to keep in a common class library.)

For example (error checking removed for clarity; you'd need to check the parameters aren't 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;
    }        

Then to remove the items from list1 as required would indeed become as simple as:

list1.RemoveAll(item => list2.Contains(item.ID));
于 2013-05-17T10:21:23.370 回答
15

我会使用这种方法:

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

这种方法删除了原位的项目。它最适用于 in 中的项目很多而 in 中的项目list1很少的情况list2
如果 和 中的项目数量list1相似list2,则 Cuong Le 的方法是一个不错的选择。

于 2013-05-17T10:13:10.700 回答
8

您可以Where更简单地使用:

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

但是您确实需要就地删除,更喜欢@DanielHilgarth的回答

于 2013-05-17T09:59:59.953 回答