从列表中删除特定属性在另一个列表中的项目?

时间:2015-11-22 23:32:07

标签: c# .net linq lambda

我有两个清单:

ListA with CancelledFlights
ListB包含所有航班

我想从ListB删除所有已取消的航班,所有航班不是通过对象进行比较,而是通过属性FlightNumber 进行比较。我怎么能用Lambda或LINQ实现这个目标?我知道如何在LINQ和lambda中选择但不知道如何删除...

2 个答案:

答案 0 :(得分:3)

您可以使用linq来执行此操作

var cancelledFlightNumbers = ListA
    .Select(x => x.FlightNumber)
    .ToList();

var cancelledFlightsRemoved = ListB
    .Where(x => !cancelledFlightNumbers.Contains(x.FlightNumber))
    .ToList();

如果您的商品太多,那么您可以使用HashSet来提高效果

var cancelledFlightNumbers = new HashSet<int>(ListA.Select(x => x.FlightNumber));

答案 1 :(得分:0)

我有两种方法可以做到这一点,一种是使用LINQ,另一种是使用List<T>方法:

  • List<T>方法:

    allFlights.RemoveAll(flight => cancelledFlight.Any(cancelled => cancelled.FlightNumber == flight.FlightNumber);

  • LINQ方法:

    // an IEqualityComparer<T> that can compare objects by FlightNumber. var flightNumberComparer = new FlightNumberComparer(); allFlights = allFlights.Except(cancelledFlights, flightNumberComparer).ToList();

正如您所看到的,对于这个简单的场景,RemoveAll可能是最简单的。它会删除原始列表中的原位项而不是创建新列表,并且可能最容易编写。

请记住,LINQ是查询语言。它并非旨在删除操作。它最多可以创建一个集合的过滤视图,并根据它创建一个 new 列表(就像我们在这里所做的那样)。但LINQ本身并不能帮助您从列表中删除项目。