我有汽车清单和这些汽车的租赁清单。每次租借都有DateTime From
和DateTime 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解决方案的纯粹和高效。
答案 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
内的汽车可能会更有效(取决于Car
和Where
的项目数)。
答案 2 :(得分:1)
最有效的方法通常是使用cv2.imread(path, cv2.IMREAD_GRAYSCALE)
(或您的情况下为antijoin)关联数据:
join