C# 如何清理此代码以消除重复?

C# 如何清理此代码以消除重复?,c#,refactoring,code-duplication,C#,Refactoring,Code Duplication,我有以下代码,其中有一些重复 private List<SelectListItem> GetDeskList(int deskId) { List<Desk> apps = Model.GetDesks(); List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem { Sele

我有以下代码,其中有一些重复

    private List<SelectListItem> GetDeskList(int deskId)
    {
        List<Desk> apps = Model.GetDesks();

        List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
        {
            Selected = c.Id == deskId,
            Text = c.Name,
            Value = c.Id.ToString()
        }).ToList();
        dropdown.Insert(0, new SelectListItem());
        return dropdown;
    }

    private List<SelectListItem> GetRegionList(int regionId)
    {
        List<Region> apps = Model.GetRegions();

        List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
        {
            Selected = c.Id == regionId,
            Text = c.Name,
            Value = c.Id.ToString()
        }).ToList();
        dropdown.Insert(0, new SelectListItem());
        return dropdown;
    }
private List GetDeskList(int deskId)
{
List apps=Model.GetDesks();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==桌面Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
私有列表GetRegionList(int regionId)
{
List apps=Model.GetRegions();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==区域Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}

还有一些类似的图案。重构此模型以避免重复的最佳方法是什么?如果您可以更改模型以实现公共接口(或从公共基类继承),则可以执行以下操作:

    private List<SelectListItem> GetDeskList(int deskId)
    {
        List<Desk> apps = Model.GetDesks();

        List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
        {
            Selected = c.Id == deskId,
            Text = c.Name,
            Value = c.Id.ToString()
        }).ToList();
        dropdown.Insert(0, new SelectListItem());
        return dropdown;
    }

    private List<SelectListItem> GetRegionList(int regionId)
    {
        List<Region> apps = Model.GetRegions();

        List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
        {
            Selected = c.Id == regionId,
            Text = c.Name,
            Value = c.Id.ToString()
        }).ToList();
        dropdown.Insert(0, new SelectListItem());
        return dropdown;
    }
var desks = GetList(123, () => Model.GetDesks());

var regions = GetList(456, () => Model.GetRegions());

// ...

private List<SelectListItem> GetList<T>(int id, Func<List<T>> getApps)
    where T : IDropdownItem
{
    List<T> apps = getApps();

    List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
        {
            Selected = c.Id == id,
            Text = c.Name,
            Value = c.Id.ToString()
        }).ToList();

    dropdown.Insert(0, new SelectListItem());
    return dropdown;
}

public interface IDropdownItem
{
    int Id { get; }
    string Name { get; }
}

public class Desk : IDropdownItem { /* ... */ }

public class Region : IDropdownItem { /* ... */ }
var-desks=GetList(123,()=>Model.GetDesks());
var regions=GetList(456,()=>Model.GetRegions());
// ...
私有列表GetList(int-id,Func-getApps)
其中T:IDropdownItem
{
List apps=getApps();
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
公共接口IDropdownItem
{
int Id{get;}
字符串名称{get;}
}
公共课课桌:IDropdownItem{/*…*/}
公共类区域:IDropdownItem{/*…*/}

只是暗中捅了一刀,但你应该这样做:

private List<SelectListItem> GetList<T>(List<T> list, int Id)
{
    List<SelectListItem> dropdown = list.ConvertAll(c => new SelectListItem
    {
        Selected = c.Id == Id,
        Text = c.Name,
        Value = c.Id.ToString()
    }).ToList();
    dropdown.Insert(0, new SelectListItem());
    return dropdown;
}
private List GetList(List List,int-Id)
{
List dropdown=List.ConvertAll(c=>new SelectListItem
{
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
}
并传入类型安全列表,而不是调用
GetList
方法中的方法
private List<SelectListItem> GetObjectList<ObjectType>(int id, Func<List<ObjectType>> getObjects)
{
    List<ObjectType> apps = getObjects();

    List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem
    {
        Selected = c.Id == id,
        Text = c.Name,
        Value = c.Id.ToString()
    }).ToList();
    dropdown.Insert(0, new SelectListItem());
    return dropdown;
}

private List<SelectListItem> GetDeskList(int deskId)
{
    return GetObjectList(deskId, (() -> Model.GetDesks()));
}

private List<SelectListItem> GetRegionList(int regionId)
{
    return GetObjectList(regionId, (() -> Model.GetRegions()));
}
{ List apps=getObjects(); 列表下拉列表=apps.ConvertAll(c=>new SelectListItem { 所选=c.Id==Id, Text=c.名称, Value=c.Id.ToString() }).ToList(); 插入(0,新的SelectListItem()); 返回下拉列表; } 私有列表GetDeskList(int deskId) { 返回GetObjectList(deskId,(()->Model.GetDesks()); } 私有列表GetRegionList(int regionId) { 返回GetObjectList(regionId,(()->Model.GetRegions()); }
是否可以对列表项类型上的函数进行模板化,然后传入列表

private List<SelectListItem, ItemType> GetRegionList(int theId, List<ItemType> apps) 
{ 
     List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
    { 
        Selected = c.Id == theId, 
        Text = c.Name, 
        Value = c.Id.ToString() 
    }).ToList(); 
    dropdown.Insert(0, new SelectListItem()); 
    return dropdown; 
} 

List<Desk> apps = Model.GetDesks();
GetRegionList<SelectListItem,Desk>(ID, apps);
private List GetRegionList(int-theId,List-apps)
{ 
列表下拉列表=apps.ConvertAll(c=>new SelectListItem
{ 
所选=c.Id==Id,
Text=c.名称,
Value=c.Id.ToString()
}).ToList();
插入(0,新的SelectListItem());
返回下拉列表;
} 
List apps=Model.GetDesks();
GetRegionList(ID、应用程序);

我还强烈建议您看看Matthew Cochran关于模式的一些博客。我发现它们真的很有用。这里有一个:
只要在他的帖子下面看看他的一些模式。

在你的例子中,我无法编译你的解决方案,因为我遇到了无法解析c.Id或c.Name的错误。知道为什么吗?@ooo:我刚刚编辑了一篇。为此,您的模型需要使用这些属性实现公共接口(或从公共基类继承)。