2010-06-28 11 views
17

Come mai le funzioni anonime funzionano come argomenti sui metodi, ma non negli argomenti del costruttore?SortedSet <T> e anonymous IComparer <T> nel costruttore non funziona


Se creo un List<string>, è un metodo di ordinamento con la seguente firma:

public void Sort(IComparer<T> comparer) 

dove le seguenti opere:

List<string> list = new List<string>(); 
list.Sort((a,b) => a.CompareTo(b)); 

SortedSet ha un costruttore con una firma simile :

public SortedSet(IComparer<T> comparer) 

ma questo non riesce quando si utilizza una funzione anonima nel costruttore. Quanto segue non è valido:

SortedSet<string> set = new SortedSet<string>((a, b) => a.CompareTo(b)); 

Creazione di una classe di ordinamento funziona bene come previsto:

public class MyComparer : IComparer<string> 
{ 
    public int Compare(string a, string b) 
    { return a.CompareTo(b); } 
} 

SortedSet<string> set = new SortedSet<string>(new MyComparer()); 

risposta

27

che è a causa the constructor accetta un (interfaccia) IComparer<T>, piuttosto che un Comparison<T> (delegato). Anon-methods/lambdas può supportare i delegati, ma non le interfacce (direttamente). E 'abbastanza facile da avvolgere, anche se - per esempio:

class FuncComparer<T> : IComparer<T> 
{ 
    private readonly Comparison<T> comparison; 
    public FuncComparer(Comparison<T> comparison) { 
     this.comparison = comparison; 
    } 
    public int Compare(T x, T y) { 
     return comparison(x, y); } 
} 

Ora è possibile utilizzare:

SortedSet<string> set = new SortedSet<string>(
     new FuncComparer<string>((a, b) => a.CompareTo(b))); 
+0

Grazie per la spiegazione e il codice wrapper. Ora vedo che stavo usando il Confronto e non IComparere in ordine. –

0

io il tuo caso list.sort utilizza questa firma

public void Sort(Comparison<T> comparison) 

ma non questo

public void Sort(IComparer<T> comparer) 
18

Il .NET Framework 4.5 ri locazione ha introdotto il metodo factory Comparer<T>.Create:

var set = new SortedSet<string>(
    Comparer<string>.Create((a, b) => a.CompareTo(b))); 
+0

Cosa fare se si desidera distinguere il set tra le chiavi ma ordinato per valori? – shinzou

0

La spiegazione è grande che SortedSet accetta un'interfaccia, ma non un delegato (Ma Java fa)..

Per questo motivo, i tipi .Net forniscono un metodo factory per creare tale oggetto, quindi non è necessario definire una nuova classe per questo.

var set = new SortedSet<string>( 
    Comparer<string>.Create((a, b) => a.CompareTo(b)) 
); 
Problemi correlati