我有以下方法确定我需要从DB中删除哪些车.
private List<CarDTO> BuildCarsToDelete(IList<CarDTO> newCars, IList<CarDTO> existingCars)
{
var missingCars = new List<CarDTO>();
var cars = newCars.Select(c => c.CarId);
var newCarIds = new HashSet<int>(cars);
foreach (var car in existingCars)
{
//If there are no new cars then it had some and they have been removed
if (newCars.Count() == 0)
{
missingCars.Add(car);
}
else
{
if (!newCarIds.Contains(car.CarId))
{
missingCars.Add(car);
}
}
}
return missingCars;
}
Run Code Online (Sandbox Code Playgroud)
这可以按我的意愿工作 - 但是如果我想为其他DTO的客户或公寓实现相同的功能,我将复制粘贴代码,但只更改变量名称和DTO类型 - 是否有更好的方法使用generics会保持算法和逻辑,但允许我在任何DTO上使用?
如果所有id都是类型,int那么你可以通过传入a Func来确定id.
private List<T> BuildToDelete<T>(
IList<T> newItems,
IList<T> existingItems,
Func<T, int> getId)
{
var missingItems = new List<T>();
var items = newItems.Select(getId);
var newItemIds = new HashSet<int>(items);
foreach (var item in existingItems)
{
if (newItems.Count() == 0)
{
missingItems.Add(item);
}
else
{
if (!newItemIds.Contains(getId(item)))
{
missingItems.Add(item);
}
}
}
return missingItems;
}
Run Code Online (Sandbox Code Playgroud)
然后打电话如下:
var results = BuildToDelete(newCars, existingCars, c => c.CarId);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |