2012-01-05 17 views
15

संभव डुप्लिकेट:
C# if statements matching multiple valuesसरल करता है, तो (एक्स == 1 || एक्स == 2)

मैं अक्सर अपने आप को कोड लिखने जहां एक चर या तो ए या बी हो सकता है लगता है उदाहरण के लिए, जब मैं एक पुनरावर्तक पर OnItemDataBound फोन:

protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {} 
} 

मैं तो अक्सर लगता है, वहाँ ऐसा करने का एक सरल तरीका होना चाहिए। मैं की तरह कुछ लिखने के लिए करना चाहते हैं:

if(x == (1 || 2)) 

एसक्यूएल, में (..) ऑपरेटर है वहाँ सी # में कुछ इसी तरह है?

WHERE x IN(1,2) 

मुझे पता है कि मैं इसके बजाय स्विच-स्टेटमेंट का उपयोग कर सकता हूं, लेकिन यह आसान विचार नहीं है। यदि संभव हो तो मैं इसे अगर एक कथन में किया जाना चाहता हूं।

+0

सबसे अधिक पढ़ने योग्य तरीका: 'if'। सबसे तेज़ तरीका: शायद 'स्विच'। सिंटैक्स जो समस्या को हल करता है: COBOL: D –

+0

'if (e.Item.DataItem == null) वापसी;' के बजाय '(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 'दोहराना बंद करने की बात आती है जब लिखना बहुत आसान है। स्विच स्टेटमेंट के लिए –

उत्तर

7

यदि आप एसक्यूएल इन कथन की नकल करना चाहते हैं तो आप ऐसा कुछ कर सकते हैं ... 2 आइटम रखने के साधारण मामले के लिए, यह शायद आसान नहीं है, लेकिन अधिक वस्तुओं के लिए, यह निश्चित रूप से होगा।

(new[] { 1, 2 }).Contains(x); 
15

मुझे लगता है कि यह ठीक है के रूप में है, हालांकि, आप की तरह कुछ कर सकता है:

// note the array is actually mutable... just... don't change the contents ;p 
static readonly ListItemType[] specialTypes = 
    new[]{ListItemType.Item, ListItemType.AlternatingItem}; 

और के खिलाफ जांच:

if(specialTypes.Contains(e.Item.ItemType)) { 
    // do stuff 
} 

लेकिन जोर देना: मैं वास्तव में सिर्फ एक switch यहाँ का उपयोग करेंगे, switch पूर्णांकों और enums पर के रूप में विशेष आईएल हैंडलिंग है कूद-टेबल के माध्यम से, यह बहुत ही कुशल बनाने:

switch(e.Item.ItemType) { 
    case ListItemType.Item: 
    case ListItemType.AlternatingItem: 
     // do stuff 
     break; 
} 
+1

+1। मैंने इसे अतीत में उपयोग किया है, आम तौर पर जब मैं मदर या हेडरिंग इटैम जैसे फूटर या हेडर से अधिक संभाल रहा था, लेकिन मैंने अभी इसका इस्तेमाल किया है क्योंकि यह अभी भी अगर स्टेटमेंट –

0

जब तक कोई भी बहुत संभव विकल्प च या एकल if, आपका कोड पठनीय है और स्पष्ट, जो सबसे महत्वपूर्ण है।

आप अक्सर अधिक 3 शर्त के साथ मिलने if, आप

new List<..>{ condition1, condition2, ... ConditionN}.Any<>() उपयोग कर सकते हैं।

ऐसा कुछ।

12

आप इस तरह एक विस्तार विधि लिख सकते हैं:

public static bool In<T>(this T x, params T[] values) 
{ 
    return values.Contains(x); 
} 

और यह इस तरह कहते हैं:

1.In(2,3,4) 

लेकिन मैं यह प्रयास के लायक नहीं है कहेंगे।

+7

लिखने के बजाय क्लीनर था, तो आप दिलचस्प आवेदन करते हैं, आप इसे 'वापसी मूल्यों के साथ भी छोटा लिख ​​सकते हैं। (x); ' – martinstoeckli

1

आप निम्न विधि, इस तरह में this Answer

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,2,4)) 
{ 
     // ... 
} 
0

मुझे लगता है कि के रूप में सरल है के रूप में आप प्राप्त करने के लिए जा रहे हैं। ध्यान दें कि अन्य उत्तरों या यहां तक ​​कि आपके स्वयं के सुझाव वास्तव में कुछ छोटे सिंटैक्स को छोटा करने के लिए विशेष संरचनाओं और कामकाज का उपयोग करते हैं। साथ ही, ये चालाक कामकाज प्रदर्शन में बाधा डालता है।

लेकिन, दो से तीन वस्तुओं के लिए जो बहुत अधिक जगह का उपयोग करते हैं, मैं पढ़ने को थोड़ा आसान बनाने के लिए बाद की रेखाओं पर स्थितियों को रखना चाहता हूं।

if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine || 
    x == MyEnum.TheOtherNameThatWastesSpace) 
{ 
// The simplest code. 
} 

मुझे लगता है कि यदि आप संभावित मानों की बहुत लंबी सूची थी सरणी दृष्टिकोण काफी बेहतर है।

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