我有以下代码,我想以一种最少重复代码的方式编写代码.
if (Categories != null)
{
bool flag=false;
foreach (dynamic usableCat in Category.LoadForProject(project.ID))
{
foreach (dynamic catRow in Categories)
{
if (usableCat.ID == catRow.ID)
flag = true;
}
if (!flag)
{
int id = usableCat.ID;
Category resolution = Category.Load(id);
resolution.Delete(Services.UserServices.User);
}
}
}
if (Priorities != null)
{
bool flag = false;
foreach (dynamic usableCat in Priority.LoadForProject(project.ID))
{
foreach (dynamic catRow in Priorities)
{
if (usableCat.ID == catRow.ID)
flag = true;
}
if (!flag)
{
int id = usableCat.ID;
Priority resolution = Priority.Load(id);
resolution.Delete(Services.UserServices.User);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,类别和优先级没有包含ID的公共基本类型或接口.
void DeleteUsable<Ttype>(IEnumerable<Ttype> usables, IEnumerable<Ttype> collection, Func<int, Ttype> load)
{
bool flag = false;
foreach (dynamic usableCat in usables)
{
foreach (dynamic catRow in collection)
{
if (usableCat.ID == catRow.ID)
flag = true;
}
if (!flag)
{
int id = usableCat.ID;
Ttype resolution = load(id);
resolution.Delete(Services.UserServices.User);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:调用它:
if (Categories != null)
DeleteUsable(Category.LoadForProject(project.ID), Categories, Categoriy.Load);
if (Priorities != null)
DeleteUsables(Priority.LoadForProject(project.ID), Priorities, Priority.Load);
Run Code Online (Sandbox Code Playgroud)
让我建议一种替代方法:不要将事情分解出来flag,而是使用 LINQ 来消除对标志循环的需要:
if (Categories != null)
{
foreach (var usableCat in Category.LoadForProject(project.ID))
{
if (!Categories.Any(row => usableCat.ID == row.ID))
Category.Load(usableCat.ID).Delete(Services.UserServices.User);
}
}
if (Priorities != null)
{
foreach (var usablePri in Priority.LoadForProject(project.ID))
{
if (!Priorities.Any(row => usablePri.ID == row.ID))
Priority.Load(usablePri.ID).Delete(Services.UserServices.User);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |