że ma przekazać tablicę dowolnych obiektów do funkcji jak String.Join
który posiada następujące PODPISYPrzechodząc tablicę funkcji, która przyjmuje albo params Zadanie [] lub IEnumerable <T>
public static string Join(string separator, params Object[] values)
public static string Join(string separator, IEnumerable<T> values)
Gdybym wywołać funkcję tak:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("\n", arr);
otrzymuję błąd kompilatora:
The call is ambiguous between the following methods or properties: 'string.Join(string, params object[])' and 'string.Join(string, System.Collections.Generic.IEnumerable)'
mogę rozwiązać niejednoznaczność za pomocą funkcji IEnumerable<T>
:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join<MyClass>("\n", arr);
Ale mogę wywołać funkcję params object[]
? W krytycznym scenariuszu wydajności lepiej byłoby uzyskać dostęp do tablicy bezpośrednio, niż przez moduł wyliczający.
Używam C# 4.0, jeśli to robi różnicę.
Jak wspomniałem w moim pytaniu, chcę przekazać tablicę do odpowiedniej implementacji mojej własnej funkcji (nie String.Join, ale coś z podobnymi sygnaturami metod). Różnice w wydajności wynikają z różnych implementacji mojej funkcji. Niektóre operacje, takie jak uzyskanie liczby elementów w kolekcji, są wykonywane szybciej przy użyciu tablicy niż "IEnumerable". –
bouvierr
Metoda rozszerzenia Count() używa właściwości .Length w przypadku, gdy IEnumerable jest tablicą, ale nie o to ci chodzi. Możesz rozważyć użycie różnych nazw dla członków i nie polegać na rozdzielczości przeciążenia, jeśli różnica wydajności jest tak ważna. Dlatego nie będziesz musiał wymuszać typów kompilacji, aby uzyskać semantykę, której szukasz. – Doug