如何根据另一个列表中的值有效过滤List中的元素

时间:2016-05-13 09:12:32

标签: c# linq

我有汽车清单和这些汽车的租赁清单。每次租借都有DateTime FromDateTime To以及Car Car属性。

我想从汽车列表中排除那些在所选时段不可用的汽车。此期间的开头和结尾是两个DateTimePickers的值。

我通过以下代码实现了我的目标:

  public void FilterAvailableCars() {             
            List<Car> cars = ObjectPlus.Objects[typeof(Car)].Select(o => (Car)o).ToList();               
            List<Rental> rentals = ObjectPlus.Objects[typeof(Rental)].Select(r => (Rental)r).ToList();          
            foreach (var rent in rentals) {
                if (fromDateTimePicker.Value < rent.To && rent.From < toDateTimePicker.Value) {
                    cars.Remove(rent.Car);
                }            
            }
            carListBox.DataSource = cars;               
        }

我混合了LINQ和for循环,但我想知道LINQ解决方案的纯粹和高效。

3 个答案:

答案 0 :(得分:1)

首先,根据您的条件选择所有租车:

  var rentalCars = rentals.Where(rent => 
                  fromDateTimePicker.Value < rent.To && rent.From < toDateTimePicker.Value)
      .Select(r => r.Car);

然后,使用Except方法获得结果:

  carListBox.DataSource = cars.Except(rentalCars);

答案 1 :(得分:1)

几乎没有修复:

// filter rentals within entered date
var rentals = ObjectPlus.Objects[typeof(Rental)].Cast<Rental>()
    .Where(rent => fromDateTimePicker.Value < rent.To && rent.From < toDateTimePicker.Value);
// filter rented cars 
carListBox.DataSource = ObjectPlus.Objects[typeof(Car)].Cast<Car>()
    .Where(car => !rentals.Any(rent => rent == car)).ToList();

使用Cast/OfType并使用单个Where进行过滤(创建列表并从中删除项目效率低下)。

我不知道Except的效率如何,如果你没有实例化查询结果(使用ToList()),那么效率应该相同。

检查租车Rental内的汽车可能会更有效(取决于CarWhere的项目数)。

答案 2 :(得分:1)

最有效的方法通常是使用cv2.imread(path, cv2.IMREAD_GRAYSCALE)(或您的情况下为antijoin)关联数据:

join