2008-10-23 3 views
17

J'essaie de trier une liste en utilisant des délégués mais j'obtiens une erreur de correspondance de signature. Le compilateur dit que je ne peux pas convertir à partir d'une 'méthode anonyme'Listes de tri de problèmes utilisant des délégués

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

Qu'est-ce qui me manque?

Voici quelques références que j'ai trouvées et elles le font de la même manière.

Developer Fusion Reference

Microsoft Reference

Répondre

46

Je pense que vous voulez:

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

Pour trier vous avez besoin d'autre chose que « vrai/faux », vous devez savoir si son égal, supérieur ou inférieur.

+14

Dans Lambda, il y aura: 'myList.Sort ((t1, t2) => t1. ID.CompareTo (t2.ID)); ' – Jaider

10

Le tri ne prend pas un prédicat binaire, il faut un délégué Comparison<T> qui retourne un int pas bool.

Les valeurs de retour sont 0 lorsque les éléments sont égaux, <0 lorsque le premier élément est inférieure à la seconde, et >0 lorsque le premier élément est supérieure à la seconde.

0

Assurez-vous que votre propriété d'ID est le type de données par défaut, par exemple Int ou String. Si l'ID est un type de référence d'objet, cet objet doit implémenter IComparer ou IComparer.

0

Désolé pour le post précédent. L'éditeur ne prend pas <et> caractères, et je n'ai pas remarqué l'aperçu juste sous l'éditeur. Si la propriété ID est un type d'objet, l'objet doit implémenter IComparer ou IComparer <T>.

2

À l'avenir, si vous voulez des problèmes de débogage comme cela, je préconise briser la définition du délégué de l'appel de tri, comme ceci:

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

De cette façon, vous pouvez voir si le problème est dans votre appel de méthode ou dans la définition de votre délégué. Certaines personnes préfèrent le laisser de cette façon (avec un nom plus descriptif que "c", évidemment) pour rendre le code plus lisible. Je pourrais le prendre ou le laisser = -)

0

Le chemin de obj.Sort (delegate (...)); est le tri dynamique en un seul endroit. Si vous avez plusieurs emplacements faisant le même tri ou si vous avez besoin d'un tri plus souple, vous pouvez envisager de créer une classe implémentant IComparer <T>. Voici un exemple:

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 
} 

et est ici l'exemple de l'utiliser:

List<MyType> myList = GetList(); 
myList.Sort(new MyTypeComparer()); 
// myList.Sort(new MyTypeComparer(false)); 
// myList.Sort(new MyTypeComparer("FirstName", true)); 
Questions connexes