IComparer utilisant Lambda Expression
class p {
public string Name { get; set; }
public int Age { get; set; }
};
static List<p> ll = new List<p>
{
new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20},
new p{Name="Exab",Age=45},new p{Name="G123",Age=19}
};
protected static void SortList()
{
IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); <==(Line 1)
ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2)
}
Ici la Liste.le tri s'attend à une IComparer<p>
comme paramètre. Et il fonctionne avec le lambda
comme indiqué à la Ligne 2. Mais quand j'ai essayer de faire comme dans la Ligne 1, j'obtiens cette erreur:
Ne peut pas convertir expression lambda pour
type
Système.Les Collections.Génériques.IComparer'
parce qu'il n'est pas un type délégué
J'ai étudié cela fait déjà quelques temps mais je ne comprends toujours pas.Peut-être que ma compréhension de IComparer est pas assez bonne.Quelqu'un peut-il me donner un coup de main ?
source d'informationauteur josephj1989
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ne
ll.Sort((x, y) => x.Name.CompareTo(y.Name));
il utilise la surcharge pourComparison<T>
pasIComparer
.Comparison<T>
est un délégué, de sorte que vous pouvez utiliser une expression lambda.Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name);
fonctionne.Il y a une solution, vous pouvez consulter: https://stackoverflow.com/a/16839559/371531
Celui-ci utilise la Comparer<T>.Créer introduit dans .NET Framework 4.5.
IComparer est une interface, pas un délégué.
Vous aurez envie d'utiliser l'expression lambda sur son .CompareTo(), et non sur l'interface elle-même.
Utilisation suivantes simple de la classe: