2013-08-02 9 views
5

उदाहरण:एकाधिक तर्क विधि में सरणी और एक तत्व को कैसे पास किया जाए?

public void foo(params string[] s) { ... } 

हम इस विधि के साथ कॉल कर सकते हैं:

a) foo("test", "test2", "test3") // multiple single strings 
b) foo(new string[]{"test", "test2", "test3"}) // string array 

लेकिन इसके साथ विधि कॉल करने के लिए संभव नहीं है:

c) foo("test", new string[]{"test", "test2", "test3"}) 

तो जब मैं एक एकल स्ट्रिंग है और तारों की एक सरणी, क्या मुझे विधि को कॉल करने के लिए पहले उन्हें एक सरणी में रखना होगा? या स्ट्रिंग सरणी को एकल स्ट्रिंग के रूप में मानने के तरीके को बताने के लिए एक अच्छा कामकाज है?

+0

आप उन्हें एक सरणी में डाल करने के लिए पहले –

+0

हाँ, आप उन्हें एक सरणी में डाल करने के लिए है है ... समारोह हस्ताक्षर से मेल करने के लिए। जब तक आप एक रैपर विधि नहीं जोड़ते हैं जो स्ट्रिंग और तारों की सरणी लेता है। –

+0

उस के लिए शब्दकोश <स्ट्रिंग, स्ट्रिंग []> का उपयोग करें –

उत्तर

0

केवल विधि का अंतिम पैरामीटर पैरामीटर सरणी (params) हो सकता है ताकि आप एक से अधिक चर को किसी विधि में पास नहीं कर सकें जिसका हस्ताक्षर केवल params में होता है।

इसलिए C में आप जो करने का प्रयास कर रहे हैं, वह संभव नहीं है और आपको उस स्ट्रिंग को सरणी में जोड़ना होगा, या एक अधिभार बनाना होगा जो पहले स्ट्रिंग पैरामीटर भी लेता है।

public void foo(string firstString, params string[] s) 
{ 
} 
0

मैं तुम्हें यह सोचते रहे कि string[] s एक एकल स्ट्रिंग तर्क के साथ ही तार की एक सरणी है, जो यह नहीं है स्वीकार करता है लगता है। आप इसे प्राप्त कर सकते हैं।

public static void Test(string[] array, params string[] s) 
{ 

} 

(याद रखें params अंतिम तर्क हो गया है) को लागू करने की

और फिर:

Test(new string[]{"test", "test2", "test3"}, "test"); 

सूचना कैसे सरणी पहले में पारित हो जाता है, और फिर तर्क यह है कि के रूप में पारित हो जाता है params

0

बस सरणी के लिए अपने स्ट्रिंग जोड़ें:

var newArray = new string[oldArray.length+1]; 
newArray[0]=yourString; 
oldArray.CopyTo(newArray, 1); 

foo(newArray); 
1

आप एक विस्तार विधि का उपयोग कर के बिना इस का समाधान कर सकते हैं, मैं वास्तव में इस विस्तार विधि का उपयोग की सलाह देते हैं के रूप में मुझे लगता है कि यह बहुत ही उपयोगी जब भी मैं एक वस्तु है, लेकिन एक आईनेमेरेबल < टी> जो कि उस ऑब्जेक्ट को आसानी से लौटाता है।

एक्सटेंशन विधि:

public static class EnumerableYieldExtension 
{ 
    public static IEnumerable<T> Yield<T>(this T item) 
    { 
     if (item == null) 
      yield break; 

     yield return item; 
    } 
} 

विस्तार विधि कई स्थितियों में उपयोगी है। आपके मामले में, आप अब ऐसा कर सकते हैं:

string[] someArray = new string[] {"test1", "test2", "test3"}; 
foo(someArray.Concat("test4".Yield()).ToArray()); 
संबंधित मुद्दे