Domanda

Sto cercando di ordinare un elenco utilizzando i delegati ma sto riscontrando un errore di corrispondenza della firma. Il compilatore dice che non posso convertire da un "metodo anonimo"

List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );

Cosa mi sto perdendo?

Ecco alcuni riferimenti che ho trovato e lo fanno allo stesso modo.

Riferimenti sulla fusione degli sviluppatori

Riferimento Microsoft

È stato utile?

Soluzione

Penso che tu voglia:

myList.Sort( delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
);

Per ordinare hai bisogno di qualcosa di diverso da " true / false " ;, devi sapere se è uguale a, maggiore di o minore di.

Altri suggerimenti

L'ordinamento non accetta un predicato binario, richiede un Comparison<T> delegato che restituisce un int non un bool.

I valori di ritorno sono 0 per quando gli articoli sono uguali, <0 per quando il primo articolo è inferiore al secondo e >0 per quando il primo articolo è maggiore del secondo.

In futuro, se si desidera eseguire il debug di problemi di questo tipo, si consiglia di interrompere la definizione del delegato dalla chiamata di ordinamento, in questo modo:

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);

In questo modo, puoi vedere se il problema è nella chiamata del metodo o nella definizione del delegato. Alcune persone preferiscono lasciarlo in questo modo (con un nome più descrittivo di & Quot; c & Quot ;, ovviamente) per rendere il codice più leggibile. Potrei prenderlo o lasciarlo = -)

Assicurati che la tua proprietà ID sia il tipo di dati del valore predefinito, come Int o String. Se l'ID è un tipo di riferimento oggetto, quell'oggetto dovrebbe implementare IComparer o IComparer.

Ci scusiamo per il post precedente. L'editor non accetta & Lt; e > personaggi, e non ho notato l'anteprima proprio sotto l'editor. Se la proprietà ID è un tipo di oggetto, l'oggetto dovrebbe implementare IComparer o IComparer & Lt; T & Gt ;.

The way of obj.Sort (delegate (...)); è l'ordinamento dinamico in un unico posto. Se hai diversi posti che fanno lo stesso ordinamento o hai bisogno di un ordinamento più flessibile, puoi considerare di creare una classe che implementa IComparer & Lt; T & Gt ;. Ecco un esempio:

public class MyTypeComparer : IComparer<MyType>
{
  public MyTypeComparer() // default comparer on ID
  { ... }

  public MyTypeComparer(bool desc) // default with order specified

  public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false.
  { ... }

  public int Compare(MyType a, MyType b) // implement IComparer interface
  { ... } // this is real sorting codes
}

ed ecco l'esempio per usarlo:

List<MyType> myList = GetList();
myList.Sort(new MyTypeComparer());
// myList.Sort(new MyTypeComparer(false));
// myList.Sort(new MyTypeComparer("FirstName", true));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top