2014-11-19 13 views
6

Pytanie: Napisz jednej deklaracji metody, która może przyjąć zarówno List<int> i int[]metoda, która przyjmuje zarówno int [] i Lista <int>

Moja odpowiedź zaangażowany coś takiego:

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

Ale to było nie zamierzoną odpowiedź, powiedziała tak.

Jakieś pomysły, jak ten podpis metody byłby?

+0

Prawdopodobnie 'void TestMethod (IEnumerable param)' – Michael

+2

Prosiłbym o więcej szczegółów: Czy potrzebujesz użyć indeksowania 'Count' lub tablicowego? Jeśli tak, użyj 'IList '. Czy potrzebujesz użyć konkretnych metod? Jeśli nie, możesz użyć 'obiektu'. W przeciwnym razie użyj 'IEnumerable '. –

Odpowiedz

7

Można użyć IList<int> który zarówno int[] i List<int> wdrożenia:

void TestMethod(IList<int> ints) 

W ten sposób można nadal korzystać z indeksowania lub właściwość Count (tak, tablica ma właściwość Count, jeśli ją przesyłasz do IList<T> lub ICollection<T>). Jest to największe możliwe skrzyżowanie obu typów, które umożliwia szybki dostęp za pomocą for -loops lub innych supported methods.

Należy pamiętać, że niektóre metody nie są obsługiwane, nawet jeśli można je nazwać tak, jak Add, w środowisku wykonawczym zostanie uzyskana wartość NotSuportedException ("Kolekcja miała stały rozmiar"), jeśli jest używana z tablicą.

+2

Dla kompletności, proszę pamiętać, że 'IList ' pozwoli ci wywołać '.Add()', co spowoduje wyjątek w czasie wykonywania, jeśli przekażesz 'int []' zamiast 'Listy '. –

+0

Tablica ma właściwość 'Length'. Możesz użyć 'array.Count()', ale jest to metoda rozszerzenia z LINQ. – Corak

+0

@Corak: nie, ma również właściwość 'Count' za pośrednictwem' IList '->' ICollection '. Musisz go rzucić, zanim będzie widoczny. –

3

To może być prawidłowa odpowiedź:

void TestMethod(IEnumerable<int> list) 
+0

Dobra robota. Szybciej niż ja mogłem go wpisać :) – SmartDev

+0

Jak to możliwe? spróbuj tego: 'TestMethod (new int [] {1,2,3});' –

+0

:) nevermind. Zaktualizowałem go ... – SmartDev

2

Twoja metoda może być jak ten

private void SomeMethod(IEnumerable<int> values) 
1

można spróbować tego

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

wydaje się exagerated ... – InferOn

+0

@InvernoMuto: nie mam pojęcia, co to znaczy, ale musi to być poprawne;) –

+0

@InvernoMuto dlaczego nie otwierasz vs i skompiluj mój kod ?? i sprawdź wyjście? –

1

Jak na temat korzystania rodzajowych:

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

i używać go tak:

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); 

Teraz możesz przekazać dowolny rodzaj.

Powiązane problemy