使用泛型编写类似的逻辑

Ctr*_*eat 2 .net c# generics

我有以下方法确定我需要从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上使用?

juh*_*arr 5

如果所有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)