2013-08-02 9 views
5

Przykład:Jak przekazać tablicę i pojedynczy element do metody wielu argumentów?

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

Możemy nazwać to metoda z:

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

Ale to nie jest możliwe, aby wywołać metodę z:

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

więc gdy mam jeden ciąg i tablicę ciągów, czy muszę najpierw wstawić je do jednej tablicy, aby wywołać metodę? Czy istnieje dobre obejście, aby powiedzieć metodę, aby rozważyć tablicę ciągów jako pojedyncze ciągi?

+0

Trzeba umieścić je w jednej tablicy pierwszy –

+0

tak, trzeba umieścić je w jednej tablicy ... pasujące do podpisu funkcji. O ile nie dodasz metody wrappera, która pobiera ciąg znaków i tablicę łańcuchów. –

+0

użyć do tego celu Słownika

Odpowiedz

0

Jedynym ostatnim parametrem metody może być tablica parametrów (params), więc nie można przekazać więcej niż jednej zmiennej do metody, której podpis przyjmuje tylko params.

W związku z tym to, co próbujesz zrobić w C, nie jest możliwe i musisz dodać ten ciąg do tablicy lub utworzyć przeciążenie, które najpierw pobiera parametr ciągu.

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

Myślę, że przy założeniu, że string[] s przyjmuje jeden argument ciąg znaków, a także tablicę łańcuchów, które nie. Możesz to osiągnąć przez.

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

} 

(Pamiętaj params musi być ostatni argument)

A potem powołać:

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

Zauważ, że tablica jest przekazywana, a potem argument, który jest przekazywany jako params.

0

Wystarczy dodać ciąg do tablicy:

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

foo(newArray); 
1

Chociaż można rozwiązać ten problem bez użycia metodę rozszerzenia, tak naprawdę zalecamy stosowanie tej metody wydłużania jak znajdę to bardzo przydatne, gdy mam jeden obiekt, ale Potrzebuję niezliczonej liczby, która po prostu zwraca ten pojedynczy obiekt.

metoda Extension:

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

     yield return item; 
    } 
} 

Metoda rozszerzenie jest przydatne w wielu sytuacjach. W twoim przypadku, teraz możesz to zrobić:

string[] someArray = new string[] {"test1", "test2", "test3"}; 
foo(someArray.Concat("test4".Yield()).ToArray());