基于另一个集合中的值从集合中删除 - Lambda / Linq

时间:2013-07-13 15:52:14

标签: c# lambda observablecollection

好的,这就是问题所在:

我有两个车辆列表

ObservableCollection<Car> carlist1;
ObservableCollection<Car> carlist2; 

汽车对象有一个汽车品牌和一个发动机尺寸,但我最终得到的carlist1只有carlist2没有基于该品牌的汽车。

carlist1包含:

car (mazda, 1.6)
car (audi 2.4)
car (golf 2.0)

和carlist2包含:

car (mazda 1.6)
car (mazda 1.0)
car (audi 2.0)
car (mercedes 2.8)

所以我希望carlist1能够在这个例子中打高尔夫球。

这是我的代码:

        foreach (car c2 in carlist2)
        {
            foreach (car c1 in carlist1)
            {
                if (c1.Brand == c2.Brand)
                {
                    carlist1.remove(c1)
                    break;
                }
            }
         }

如何将其转换为LINQ或Lambda?

2 个答案:

答案 0 :(得分:1)

删除必须使用foreach(因为LINQ不应该更改集合),但除此之外,您可以获取不需要的品牌,然后使用LINQ从carlist1中删除项目:< / p>

var carlist2Brands = carlist2
    .GroupBy(c => c.Brand)
    .Select(g => g.Key)
    .ToArray();
var carsToRemove = carlist1
    .Where(c => carlist2Brands.Contains(c.Brand))
    .ToArray();
foreach (var car in carsToRemove)
{
    carlist1.Remove(car);
}

答案 1 :(得分:0)

写一个'RemoveWhere'扩展名可能会很有用,它可以让你写:

var brandsToRemove = list2.Select(c => c.Brand);
list1.RemoveWhere(c => brandsToRemove.Contains(c.Brand));

扩展名如下:

    public static void RemoveWhere<T>(this List<T> list, Predicate<T> predicate)
    {
        foreach (var ele in list)
        {
            if (predicate(ele))
                list.Remove(ele);
        }
    }