2014-11-19 9 views
6

प्रश्न: एक एकल विधि घोषणा जो इस तरह दोनों List<int> और int[]विधि जो दोनों स्वीकार int [] और सूची <int>

मेरा जवाब शामिल कुछ स्वीकार कर सकते हैं लिखें:

void TestMethod(object param) // as object is the base class which can accept both int[] and List<int>

लेकिन वह था इरादा जवाब नहीं, उसने ऐसा कहा।

कोई विचार यह तरीका हस्ताक्षर कैसे होगा?

+0

शायद 'शून्य परीक्षण विधि (IENumerable परम)' – Michael

+2

मैं अधिक जानकारी के लिए पूछता हूं: क्या आपको 'गणना' या सरणी जैसी सबस्क्रिप्टिंग का उपयोग करने की आवश्यकता है? यदि ऐसा है, तो 'IList ' का उपयोग करें। क्या आपको किसी विशिष्ट तरीके का उपयोग करने की आवश्यकता है? यदि नहीं, तो आप 'ऑब्जेक्ट' का उपयोग कर सकते हैं। अन्यथा, 'IENumerable ' का उपयोग करें। –

उत्तर

7

आप IList<int> उपयोग कर सकते हैं जो दोनों, int[] और List<int> लागू:

void TestMethod(IList<int> ints) 

कि जिस तरह से आप अभी भी इंडेक्सर या Count संपत्ति का उपयोग कर सकते पर (हाँ, एक सरणी में Count संपत्ति है यदि आप इसे IList<T> या ICollection<T> पर डाल दें)। for -loops या अन्य supported methods का उपयोग करके, दोनों प्रकारों के बीच यह सबसे बड़ा संभव चौराहे है जो तेजी से पहुंच की अनुमति देता है।

ध्यान दें कि कुछ तरीकों वे Add की तरह कहा जा सकता है, भले ही समर्थन नहीं कर रहे हैं, तो आप मिल जाएगा रनटाइम पर एक NotSuportedException ("संग्रह एक निश्चित आकार का था") यदि आप एक सरणी के साथ उपयोग करें।

+2

पूर्णता के लिए, ध्यान रखें कि 'IList ' आपको 'अजीब() 'कॉल करने देगा, जो रनटाइम अपवाद का कारण बनता है यदि आप' सूची 'के बजाय' int []' पास करते हैं '। –

+0

एक सरणी में 'लंबाई' संपत्ति है। आप 'array.Count()' का उपयोग कर सकते हैं, लेकिन यह LINQ से एक विस्तार विधि है। – Corak

+0

@ कोराक: नहीं, इसमें 'IList ' -> 'ICollection ' के माध्यम से 'गणना' संपत्ति भी है। इसे दिखने से पहले आपको इसे कास्ट करना होगा। –

3

यह सही जवाब हो सकता है:

void TestMethod(IEnumerable<int> list) 
+0

ठीक है। जितना तेज़ मैं इसे टाइप कर सकता हूं :) – SmartDev

+0

कैसे आते हैं? इसे आज़माएं: 'TestMethod (नया int [] {1,2,3}); ' –

+0

:) कभी नहीं। मैंने इसे अद्यतन किया ... – SmartDev

2

आपका विधि इस

private void SomeMethod(IEnumerable<int> values) 
1

की तरह हो सकता है आप इस

private void TestMethod(dynamic param) 
{ 
    // Console.Write(param); 

    foreach (var item in param) 
    { 
     Console.Write(item); 
    } 
} 

TestMethod(new int[] { 1, 2, 3 }); 
TestMethod(new List<string>() { "x","y","y"}); 
+8

अतिरंजित लगता है ... – InferOn

+0

@InvernoMuto: मुझे नहीं पता कि इसका क्या अर्थ है लेकिन यह सही होना चाहिए;) –

+0

@InvernoMuto क्यों आप अपना कोड बनाम बनाते हैं और संकलित नहीं करते ?? और आउटपुट की जांच करें? –

1

कैसे जेनेरिक्स उपयोग के बारे में की कोशिश कर सकते हैं:

public static void TestMethod<T>(IEnumerable<T> collection) 
{ 
    foreach(var item in collection) 
    { 
     Console.WriteLine(item); 
    } 
} 

और इस तरह इसका इस्तेमाल:

int[] intArray = {1,2}; 
List<int> intList = new List<int>() { 1,2,3}; 
int[] intArray = {1,2}; 
List<int> intList = new List<int>() { 1,2,3}; 

TestMethod(intArray); 
TestMethod(intList); 

string[] stringArray = { "a","b","c"} 
List<string> stringList = new List<string>() { "x","y","y"}; 

TestMethod(stringArray); 
TestMethod(stringList); 

अब आप इसे किसी भी प्रकार से पास कर सकते हैं।

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