2017-10-07 34 views
0

J'ai mis mes propres classes GenericList et des tâches telles que:Liste générique et IComparable Tri Erreur: Impossible de convertir l'expression lambda

public GenericList<T> where T: Task 
{ 
    public List<T> list = new List<T>(); 
    .... 
    public void Sort() 
    { 
    list = list.Sort((a,b) => b.Id.CompareTo(a.Id) > 0); 
    //here I am getting the Error Warning by Visual Studio IDE 
    //Error: Can not convert lambda expression to 
    //'System.Collections.Generic.IComparer<T>' because it is not a delegate type 
    } 
} 

public class Task 
{ 
    public int Id {get; set;} 
    public Task(int ID) 
    {Id = ID;} 
} 

here I am getting the Error Warning by Visual Studio IDE Error: Can not convert lambda expression to 'System.Collections.Generic.IComparer' because it is not a delegate type

J'ai essayé même de mettre en œuvre les éléments suivants à la place dans le Trier() méthode utilisant la méthode Compare.Create:

list = list.OrderBy(x => x.Id, 
      Comparer<Task>.Create((x, y) => x.Id > y.Id ? 1 : x.Id < y.Id ? -1 : 0)); 
//Here the Error: the type argument for the method can not be inferred 

Mais j'obtiens toujours l'erreur. J'essaie de trier les tâches en fonction de leurs identifiants dans mon implémentation de Sort dans GenericList. Quelqu'un peut-il m'aider comment puis-je être en mesure d'atteindre cet objectif?

Toute aide est appréciée. Merci d'avance.

Répondre

0

Essayez de commander simplement par la propriété en utilisant lambda. Pas besoin d'utiliser

OrderBy(< TSource >, Func< TSource, TKey >)

Dans le OrderBy(), vous pouvez simplement mentionner la propriété que vous souhaitez commander par (jeu de mots). Dans votre tâche de classe, vous avez déjà mentionné l'ID de propriété à int, vous pouvez donc simplement utiliser cette propriété pour la comparer.

Essayez quelque chose comme ceci:

.... 
list = list.OrderBy(x => x.Id).ToList(); 
.... 
+0

Merci pour votre aide. Cela a fonctionné parfaitement. –

2

Tout d'abord, n'attribuez pas le résultat Sort() à la variable car c'est in-place sorting. Et changer votre code pour

list.Sort((a, b) => b.Id.CompareTo(a.Id)); // sort and keep sorted list in list itself 
+0

J'apprécie vraiment votre réponse et aide. Mais cela donne également une erreur: Impossible de convertir implicitement le type void en System.Collections.Generic.List . –

+1

La méthode List.sort renvoie la valeur vide. Donc, je crois, vous assignez le résultat de list.sort à la variable, vous ne devriez pas l'assigner. –