123 votes

Trier une liste de cours personnalisée <T>

Je voudrais trier ma liste avec la propriété date .

Ceci est ma classe personnalisée:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Test.Web
{
    public class cTag
    {
        public int id { get; set; }
        public int regnumber { get; set; }
        public string date { get; set; }
    }
}
 

Voici le List que je veux trier:

 List<cTag> Week = new List<cTag>();
 

Ce que je veux faire, c'est trier la liste par la propriété date de la classe cTag. La date est au format: jj.mm.maaaa.

J'ai lu quelque chose sur l'interface IComparable , mais je ne sais pas comment l'utiliser.

154voto

ahsteele Points 12230
Un bureau assis-debout permet

52voto

Ondřej Calda Points 972

Il est exact que votre cTag classe doit implémenter IComparable<T> interface. Ensuite, vous pouvez simplement appeler Sort() sur votre liste.

Pour mettre en oeuvre IComparable<T> interface, vous devez implémenter CompareTo(T other) méthode. La façon la plus simple pour ce faire est d'appeler la méthode CompareTo de la zone que vous souhaitez comparer, ce qui dans votre cas est de date.

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public string date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

Cependant, ce ne serait pas de tri bien, parce que ce serait une utilisation classique de tri sur des chaînes de caractères (depuis que vous avez déclarée à la date sous forme de chaîne). Donc, je pense que la meilleure pensez à faire serait de redéfinir la classe et de déclarer la date n'est pas une chaîne, mais en DateTime. Le code devrait rester pratiquement la même:

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public DateTime date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

La seule chose que vous avez à faire lors de la création de l'instance de la classe pour convertir votre chaîne de caractères contenant la date en type DateTime, mais il peut être fait facilement par exemple, en DateTime.Parse(String) méthode.

38voto

Yakimych Points 9312

Dans ce cas, vous pouvez également trier à l'aide de LINQ:

 week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
 

12voto

Darin Dimitrov Points 528142
List<cTag> week = new List<cTag>();
Week.Sort((x, y) => 
    DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo(
    DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture))
);

6voto

AJ. Points 668

Vous avez raison - vous devez implémenter IComparable. Pour ce faire, déclarez simplement votre classe:

 public MyClass : IComparable
{
  int IComparable.CompareTo(object obj)
  {
  }
}
 

Dans CompareTo, vous venez d'implémenter votre algorithme de comparaison personnalisé (vous pouvez utiliser des objets DateTime pour le faire, mais assurez-vous simplement de vérifier le type de "obj" en premier). Pour plus d'informations, voir ici et ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X