2012-09-05 4 views
11

मैं ऐसे किसी से पूछना चाहता हूं जिसकी सी # में मेरे से मजबूत कौशल है।सी # में अगर अन्य कथन में 'बीच' जैसी कुछ परिभाषित करना संभव है?

यह संभव निम्नलिखित कोड

if(val > 20 && val < 40) 
... 
else 
if(val > 40 && val < 72) 
... 
else 
if(val > 72 && val < 88) 
... 
else 
... 

कम करने के लिए मान लेते हैं मैं 10-11 if-else से अधिक बयान है कि चलो है।

उपरोक्त कोड को छोटा करने का सबसे अच्छा तरीका क्या है?

मैंने एसक्यूएल में between जैसे कुछ पर सोचा था।

+0

आप कोड के प्रत्येक ब्लॉक में पूरी तरह से अलग अलग बातें कर रहे हैं? आपके पास 20,40,72 इत्यादि के साथ एक सूची/सरणी हो सकती है, जब तक कि कोड का ब्लॉक समान हो, लेकिन उस समूह के सूचकांक के साथ यह – Servy

+0

वीबी में संभव है लेकिन मेरे ज्ञान के लिए सी # में नहीं है। – Magnus

+0

@Magnus निष्पक्ष होने के लिए, आप आसानी से सिंटैक्स में लाइब्रेरी-आधारित बना सकते हैं जो संक्षेप में वीबी में 'केस का चयन करें' वाक्यविन्यास से मेल खाता है (लेकिन हाँ, ढांचे में कोई भी मौजूद नहीं है)। –

उत्तर

28

एक extension method परिभाषित करें: फिर

public static bool Between(this int source, int a, int b) 
{ 
    return source > a && source < b; 
} 

, इसका इस्तेमाल:

if (val.Between(20, 40)) 
//... 

रूप oɔɯǝɹ सही ढंग से उसकी टिप्पणी में बताया, तो आप एक कदम आगे और समर्थन जा सकते हैं एक सामान्य विस्तार विधि के साथ IComparable<T> के सभी कार्यान्वयनकर्ता:

public static bool Between<T>(this T source, T a, T b) where T : IComparable<T> 
{ 
    return source.CompareTo(a) > 0 && source.CompareTo(b) < 0; 
} 
+12

आप इसे एक सामान्य विस्तार विधि भी बना सकते हैं: '(यह टी स्रोत, टी ए, टी बी) के बीच सार्वजनिक स्थैतिक बूल: जहां टी: आईसीओपरपेबल ' –

+0

* उत्कृष्ट * सुझाव! – Adam

-1
if(val > 72) 
{ 

} 
else 
{ 
    if(val > 40) 
    { 
    ... 
    } 
    else 
    { 
    ... 
    } 
} 
4

ऐसा करने का एक वैकल्पिक तरीका आपकी श्रेणियों को सूची में संग्रहीत करना है और यह पता लगाने के लिए फ़ंक्शन शामिल है कि वैल सीमा के भीतर है या नहीं, लेकिन अधिक जानकारी के बिना ऐसा लगता है कि आप इसे जितना छोटा कर सकते हैं यह।

1

आप बीच में कर सकते हैं, लेकिन यह उतना ही होगा जितना अधिक कॉल करने के लिए टाइप नहीं किया जाएगा।

if(val >= 20 && val <= 88) 
{ 
    if(val <= 40) 
    ... 
    else if(val <= 72) 
    ... 
} 
else 
... 

ध्यान दें कि मैं व्यवहार के बीच मैच के लिए <= और >= उपयोग कर रहा हूँ: इस मामले में, यदि आप वास्तव में चाहते थे क्या between करता है, तो आप के साथ अधिक संक्षिप्त होगा। हालांकि, मुझे लगता है कि आप न तो 40, बिल्कुल 72 के मूल्यों के लिए दो चीजें नहीं करनी चाहते थे, न ही कुछ भी किया गया (न ही आपके प्रश्न में, कुछ भी नहीं किया जाएगा)।

0
class Range{ public int first; public int second} 

list<Range> rangeList= new list<Range> 

लिखने वर्ग

foreach(Range objRange in rangeList) 
{ 
if(val>objRange.first && val<objRange.last) 
{...... 
break; 
} 
} 
+0

@ स्नैक आंख इस दृष्टिकोण को भी आजमाएं, यह आपके कोड को मानक तरीके से छोटा कर देगा –

+0

आपको वास्तव में अपने वर्ग/परिवर्तनीय नामों पर काम करने की ज़रूरत है ... यह * आपके कोड की पठनीयता में काफी सुधार करेगा। – Servy

+0

@ सर्वी pls सुझाव है कि अवधारणा rht है या नहीं, मैंने –

1

साथ सूची में सभी संयोजन मेरी राय में यह पर्वतमाला के संग्रह के लिए अच्छा है। और यदि ब्लॉक के अंदर तर्क बहुत समान है, तो आप इस श्रेणी से जुड़े एक प्रतिनिधि को स्टोर कर सकते हैं।

RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42)); 
if(range != null) 
{ 
    dynamic result = range.SomeDelegate.DynamicInvoke(); 
} 

कहाँ RangeBase एक सरल अमूर्त है:

public abstract class RangeBase 
{ 
    public int MinValue { get; private set; } 
    public int MaxValue { get; private set; } 

    public abstract Delegate SomeDelegate { get; } 

    protected RangeBase(int minValue, int maxValue) 
    { 
     MinValue = minValue; 
     MaxValue = maxValue; 
    } 

    public bool BelongsToRange(int number) 
    { 
     return number > MinValue && number < MaxValue; 
    } 
} 
+1

सभी प्रोग्रामिंग की तरह, यह वास्तव में एक व्यापार है जहां आप अपना प्रयास कर रहे हैं। मुझे समाधान पसंद है, लेकिन अंत में यह पर्याप्त काम है कि आपने शायद इस वर्तमान परियोजना के लिए किसी वास्तविक दुनिया का समय नहीं बचाया होगा। हालांकि, यदि आप खुद को कई परियोजनाओं में इस तरह की चीज की आवश्यकता महसूस करते हैं, तो यह एक अच्छा समाधान है, इस मामले में आप अमूर्त आधार को उस पुस्तकालय में रखना चाहते हैं जिसका उपयोग आप भविष्य की परियोजनाओं के साथ करते हैं। – Stuporman

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