2

好的,这就是问题所在:

我有 2 个汽车清单

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?

4

2 回答 2

1

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

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);
}
于 2013-07-13T16:13:03.433 回答
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);
        }
    }
于 2013-07-13T16:29:08.200 回答