2013-05-21 15 views
5

को सशर्त पैरामीटर तर्क है कि कैसे मैंएक समारोह

public void Foo(string name, params object[] args) 

मैं args कि भिन्न हो सकते हैं की एक सूची से कॉल करने के लिए चाहते हैं। मैं, ख की तरह

Foo("yo",a,b,x==42?c); 

कुछ करने की ज़रूरत है यानी अगर x 42 फिर एक में पारित है, ख, अन्यथा एक में पारित c। बेशक कि वाक्यविन्यास काम नहीं करता है। मुझे पता है कि मैं एक सूची में तर्कों को मार्शल कर सकता हूं और सूची में सूची को पास कर सकता हूं, लेकिन कोड व्यवस्थित करने के तरीके के लिए यह बहुत गन्दा होगा।

if (x == 42) 
    Foo("yo", a, b, c); 
else 
    Foo("yo", a, b); 

आप ?: उपयोग नहीं कर सकते: मुझे मज़बूत स्थिति

var xml = new XDocument(...., 
    new XElement(....), 
    new XElement(....), 
    new XElement(....), 
    x==42? new XElement(.....), 
    new XElement(....), 
    new XElement(....) 
    .... 

उत्तर

10

तुम बस का उपयोग कर सकते एक अगर बयान जोड़ें: तो वहाँ कुछ वाक्य रचना जादू मैं उपयोग कर सकते हैं

संपादित है इस मामले में ऑपरेटर (कम से कम, फ़ंक्शन कॉल के बाहर), क्योंकि Foo में कोई वापसी मूल्य नहीं है। ?: ऑपरेटर को कुछ का मूल्यांकन करना चाहिए, और कुछ और किसी और को सौंपा जाना चाहिए।

एक अन्य विकल्प है कि डुप्लिकेट समारोह कॉल से छुटकारा पाने चाहते हैं किसी सरणी या पैरामीटर के लिए सूची का उपयोग करने के लिए है:

var parameters = new List<object> { a, b }; 

if (x == 42) 
    parameters.Add(c); 

Foo("yo", parameters); 

और अगर आप वास्तव में वहाँ में ?: प्राप्त करना चाहता था, इस काम करेगा, भी:

Foo("yo", x == 42 ? new object[] { a, b, c } : new object[] { a, b }); 

XDocument/XElement निर्माता कॉल के बारे में अपने अधिक विशिष्ट प्रश्न के लिए, आप निर्माता कॉल में से एक लंबी श्रृंखला के बजाय Add कॉल का उपयोग कर सकते हैं। फिर आप उन्हें सशर्त बना सकते हैं। है के रूप में, मुझे लगता है कि तुम भी आप क्या कुछ इस तरह करने से पूछ रहे हैं करने के लिए सक्षम होना चाहिए:

XElement elementPrecedingOptionalElement = new XElement(...); 

var xml = new XDocument(...., 
    new XElement(...), 
    new XElement(...), 
    elementPrecedingOptionalElement, 
    new XElement(...), 
    new XElement(...) 
); 

if (x == 42) 
    elementPrecedingOptionalElement.AddAfterSelf(new XElement(...)); 

Add कॉल का उपयोग करते हुए कुछ इस तरह दिखेगा:

XDocument xml = new XDocument(); 
XElement root = new XElement("Root"); 
xml.Add(root); 

root.Add(new XElement("Item1")); 
root.Add(new XElement("Item2")); 
if (x == 42) 
    root.Add(new XElement("Item2.5")); 
root.Add(new XElement("Item3")); 
root.Add(new XElement("Item4")); 

वास्तव में, एक आखिरी यह क्या सवाल जरूरतों के सबसे करीब (यहां तक ​​कि यह करता है, तो ':

var xml = new XDocument(...., 
    new XElement(...), 
    new XElement(...), 
    new XElement(...), 
    x == 42 
     ? new XElement(...) 
     : null, 
    new XElement(...), 
    new XElement(...) 
); 
+0

+1 'सूची <>' विकल्प के लिए: संस्करण है कि आपके लिए क्या पूछ रहे हैं के करीब है यह, जो काम करने लगता है जैसा होगा वह "गन्दा" होगा जैसा वह सा है आईडी)। –

+0

यह देखने के लिए मेरा संपादन देखें कि यह मेरे लिए क्यों काम नहीं करता है। पीएस मुझे पता है कि इसे कैसे काम करना है, मैं यह देखने की कोशिश कर रहा हूं कि क्या मैं इसे आसानी से और स्पष्ट रूप से काम कर सकता हूं - विशेष रूप से मैं इरादा स्पष्ट करना चाहता हूं। मैं उपयोग करने के लिए wnat नहीं है?:, यह सिर्फ मेरा पहला प्रयास था (जिसे मैंने तुरंत छोड़ दिया) – pm100

+0

@ pm100 ठीक अपडेट किया गया जवाब –

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