繁体   English   中英

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

[英]Remove items from a List which are in another List by a specific property?

我有两个清单:

带有CancelledFlights的ListA
ListB包含所有航班

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

你可以使用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));

我有两种方法可以做到这一点,一种是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是一种查询语言。 它不是为了删除操作而设计的。 最多,它可以创建一个集合的过滤视图,并根据它创建一个列表(就像我们在这里所做的那样)。 但LINQ本身不会帮助您从列表中删除项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM