2009-11-04 17 views
7

मैं बस जब एक अगर अभिव्यक्ति और कभी कभी अभिव्यक्ति लेखन एक विचार पिछले nigth था लंबे हो जाते हैं तो आप इसे इस तरह से है जब:,सी # ऑपरेटर-ओवरलोडिंग

if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... } 

एक्स enums हो सकता है तार , चींटियों, चार्स आपको तस्वीर मिलती है।

मैं जानना चाहता हूं कि यह लिखने का एक आसान तरीका है या नहीं। मैं एक eay के रूप में उदाहरण के लिए अभिव्यक्ति छोटा करने के लिए 'में' एसक्यूएल के ऑपरेटर के बारे में सोच:

if(x in (1,2,33,4,-5,61)) { ... } 

मैं जानता हूँ कि आप के साथ इस तरह एक अभिव्यक्ति नहीं लिख सकते हैं 'में' क्योंकि lexer और संकलक जीता की पार्सर इसे पहचान नहीं है।

शायद अन्य समाधानों के विस्तार के तरीकों के रूप में अन्य समाधान समाधान है? आने वाले .NET 4.0 में मैंने पैरामीटरयुक्त विधियों के बारे में कुछ सुना है, क्या यह if-expression को आपूर्ति किए गए पैरामीटर की n मात्रा को हल करना चाहिए?

शायद आप मुझे समझते हैं, क्या आपको इस प्रश्न के लिए एक अच्छा अभ्यास/समाधान का विचार है?

/डैनियल

+0

मैं शीर्षक थोड़ा संशय है। ऐसा लगता है कि आप एक ऑपरेटर ओवरलोड में सी # का उपयोग करना चाहते हैं। मैंने इसे बेहतर बनाने के तरीके के बेहतर विचार की कमी के लिए आईएन को कैप्स में रखा है। –

+0

दिलचस्प सवाल हालांकि –

उत्तर

13

निम्नलिखित

if ((new []{1,2,33,4,-5,61}).Any(i => x == i)) { 
    ... 
} 
+0

यह सुंदर स्टाइलिश है। –

+3

टाइप अनुमान के साथ आप 'int' (मुझे लगता है) भी छोड़ सकते हैं। – Svish

+0

@ स्विस, यह नहीं पता था कि संभव था लेकिन सत्यापित है कि यह 2010 बीटा 2 के साथ काम करता है। अद्यतन उत्तर – JaredPar

0
string[] possible = new string[3] { 1, 2, 3); 

    if (possible.Contains(x)) { ... 
+0

मुझे लगता है कि आप int चाहते थे और स्ट्रिंग नहीं कर रहे थे। – JaredPar

+0

मुझे लगता है कि सवाल सभी प्रकार के लिए था। –

+1

हम्म .. अधिक कॉफी की आवश्यकता है। – Paddy

0
bool In<T>(T num, params int args) 
    { 
     return (new List<T>(args)).Contains(num); 
    } 
+1

एक सामान्य विधि क्यों है, जो केवल इंट्स की एक सूची लेती है? इसके बजाय पैरा [टी] तर्क का उपयोग करने पर विचार करें - जिसे आप कॉल कर सकते हैं। सीधे पर निर्भर करता है। –

1
public static bool In<T>(this T X, params T[] list) 
    { 
     foreach (var item in list) 
     { 
      if (X.Equals(item)) 
       return true; 
     } 
     return false; 
    } 
+0

'वापसी सूची के बारे में कैसे। (X) प्राप्त करता है;'? –

+0

सरणी में विधि नहीं है –

+0

ऐरे लागू करता है 'आईनेमेरेबल ' जिसमें सिस्टम में एक विस्तार विस्तार विधि है। लिंक्स – Lee

0

यह देखते हुए कि एक्स एक पूर्णांक तुम इतनी तरह एक विस्तार विधि लिख सकता है का प्रयास करें:

public static bool In(this int i, params int[] values){ 
    foreach(int v in values) { 
     if (i == v) { 
      return true; 
     } 
    } 
    return false; 
} 
18

मैं आमतौर पर एक Extension Method बारे में इस प्रकार है:

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

कौन इस तरह इस्तेमाल किया जा सकता:

if(x.In(1,6,9,11)) 
{ 
     // do something.... 
} 
+1

मुझे यह पसंद है क्योंकि यह सामान्य है और इसमें == ऑपरेटर के बजाय कंटेनर विधि का उपयोग करता है। –

+0

मैं इसे पर्याप्त अंगूठे नहीं लगा सकता ... यह बहुत अधिक प्राकृतिक लगता है। मैंने एक अधिभार भी जोड़ा: सार्वजनिक स्थिर बूल (यह टी स्रोत, आईनेमेरेबल सूची) एक ही शरीर के साथ। – Crisfole