我有两个清单:
ListA with CancelledFlights
ListB包含所有航班
我想从ListB删除所有已取消的航班,所有航班不是通过对象进行比较,而是通过属性FlightNumber 进行比较。我怎么能用Lambda或LINQ实现这个目标?我知道如何在LINQ和lambda中选择但不知道如何删除...
答案 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本身并不能帮助您从列表中删除项目。