2010-07-15 40 views
9

我有以下代码,我想以最少重复代码的方式编写代码。如何消除重复的代码?

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); 
     } 
    } 
} 

请注意,类别和优先级没有包含ID的通用基本类型或接口。

+3

我假设你没有访问更改优先级或类别类? – RCIX 2010-07-15 06:43:42

+3

在您的代码示例中,您使用的是'dynamic',而您似乎可以使用'var'(早期绑定)代替。它看起来像你真正想要的是使用'dynamic'来获得迟绑定语义,在这一点上没有共同的基类型无关紧要,你可以使用'ID'字段。 (也就是说,它听起来像你想使用[鸭打字](http://en.wikipedia.org/wiki/Duck_typing)。) – 2010-07-15 06:48:26

+0

+1鸭打字:) – onof 2010-07-15 06:59:28

回答

3

让我提出另一种方法:除了分解出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); 
    } 
} 
+0

谢谢,真的很有帮助,但仍然是我的问题,以消除代码重复仍然没有解决。 – learning 2010-07-16 06:33:58

+0

@ user281180:为什么? onof的答案对我来说很不错... – Heinzi 2010-07-16 16:39:49

7
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); 
        } 
       } 
} 

编辑: 调用它:

if (Categories != null) 
    DeleteUsable(Category.LoadForProject(project.ID), Categories, Categoriy.Load); 
if (Priorities != null) 
    DeleteUsables(Priority.LoadForProject(project.ID), Priorities, Priority.Load); 
+0

谢谢,但是如何用给定的例子调用函数? – learning 2010-07-15 07:29:45

+0

我添加了调用函数的代码。 – onof 2010-07-15 07:52:16

+0

您将无法调用删除方法。 – Christian 2010-07-15 08:02:50

2

我建议的方法是这样的(因为你有机会获得动态类型):

void DeleteUsables(dynamic usablesResource, dynamic usablesCatalog) 
{ 
    bool flag = false; 
    foreach (dynamic usableCat in usablesCatalog.LoadForProject(project.ID)) 
    { 
     foreach (dynamic catRow in usablesResource) 
     { 
      if (usableCat.ID == catRow.ID) 
       flag = true;        
     } 
     if (!flag) 
     { 
      int id = usableCat.ID; 
      dynamic resolution = usablesCatalog.Load(id); 
      resolution.Delete(Services.UserServices.User); 
     } 
    } 

} 

,你会再调用像这样:

if (Categories != null) 
{ 
    DeleteUsables(Categories, Category) 
} 
if (Priorities != null) 
{ 
    DeleteUsables(Priorities, Priority) 
} 
+0

感谢您的回复,我有错误: 'System.Array'没有包含'LoadForProject'的定义 – learning 2010-07-15 07:27:03

+0

看起来RCIX忽略了'Category'和'Categories'在你的项目中是两个不同的东西。如果'Category'是一个对象(而不是一个类),则可以将它作为附加的动态参数传递。 – Heinzi 2010-07-15 20:28:03

+0

@ Heinzi:谢谢,我修好了。 @user:你去了,但我想不出第二个参数的好名字。也许你会能够? – RCIX 2010-07-15 22:50:19