voglio passare un array di oggetti personalizzati per una funzione come String.Join
che ha le seguenti firme:Passando array funzione che prende sia oggetto params [] o IEnumerable <T>
public static string Join(string separator, params Object[] values)
public static string Join(string separator, IEnumerable<T> values)
Se io chiamo la funzione come questa:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("\n", arr);
ottengo un errore di compilazione:
The call is ambiguous between the following methods or properties: 'string.Join(string, params object[])' and 'string.Join(string, System.Collections.Generic.IEnumerable)'
posso risolvere l'ambiguità utilizzando la funzione IEnumerable<T>
:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join<MyClass>("\n", arr);
Ma posso chiamare la funzione params object[]
? In uno scenario di prestazioni critiche, sarebbe preferibile accedere direttamente alla matrice piuttosto che tramite un enumeratore.
Sto usando C# 4.0, se questo fa alcuna differenza.
Come ho detto nella mia domanda, voglio passare l'array all'implementazione appropriata della mia funzione (non String.Join, ma qualcosa con firme di metodo simili). La differenza di prestazioni qui è dovuta alle diverse implementazioni della mia funzione. Alcune operazioni, come ottenere il numero di elementi nella raccolta, vengono eseguite più velocemente utilizzando una matrice piuttosto che un 'IEnumerable'. –
bouvierr
Il metodo di estensione Count() utilizza la proprietà .Length nel caso in cui l'oggetto IEnumerable sia un array, ma non è questo il punto. Potresti considerare di utilizzare nomi diversi per i membri e non fare affidamento sulla risoluzione di sovraccarico, se la differenza di prestazioni è così importante. Pertanto, non dovrai forzare i tipi in fase di compilazione per ottenere la semantica che stai cercando. – Doug