2010-07-15 17 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); 
     } 
    } 
} 

कृपया ध्यान दें कि श्रेणी और प्राथमिकता में एक सामान्य आधार प्रकार या इंटरफ़ेस नहीं है जिसमें आईडी शामिल है।

+3

मुझे लगता है कि आप प्रधान या श्रेणी कक्षाओं को बदलने के लिए पहुँच नहीं है ? – RCIX

+3

अपने कोड उदाहरण में, आप 'गतिशील' का उपयोग कर रहे हैं, जहां ऐसा लगता है कि आप इसके बजाय 'var' (प्रारंभिक बाध्यकारी) का उपयोग कर सकते हैं। ऐसा लगता है कि आप वास्तव में क्या चाहते हैं कि देर से बाध्यकारी अर्थशास्त्र प्राप्त करने के लिए 'गतिशील' का उपयोग करना है, जिस बिंदु पर इससे कोई फर्क नहीं पड़ता कि कोई सामान्य आधार प्रकार नहीं है, आप वैसे भी 'आईडी' फ़ील्ड का उपयोग कर सकते हैं। (यानी, ऐसा लगता है जैसे आप [बतख टाइपिंग] (http://en.wikipedia.org/wiki/Duck_typing) का उपयोग करना चाहते हैं।) –

+0

बतख टाइपिंग के लिए +1 :) – onof

उत्तर

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

+0

@ user281180: क्यों? onof का जवाब मेरे लिए बहुत अच्छा लग रहा है ... – Heinzi

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

+0

मैंने फ़ंक्शन को कॉल करने के लिए कोड जोड़ा। – onof

+0

आप हटाएं-विधि को कॉल करने में सक्षम नहीं होंगे। – Christian

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

+0

की परिभाषा नहीं है, ऐसा लगता है कि आरसीईक्स ने अनदेखा किया कि 'श्रेणी' और 'श्रेणियां' आपकी परियोजना में दो अलग-अलग चीजें हैं। यदि 'श्रेणी' एक वस्तु है (कक्षा के बजाए), तो आप इसे एक अतिरिक्त गतिशील पैरामीटर के रूप में पास कर सकते हैं। – Heinzi

+0

@ हिनजी: धन्यवाद, मैंने इसे ठीक किया। @user: वहां आप जाते हैं, हालांकि मैं दूसरे पैरामीटर के लिए एक अच्छा नाम नहीं सोच सका। शायद आप करने में सक्षम होंगे? – RCIX

संबंधित मुद्दे