Trier une liste de classes personnalisée

Je voudrais sortinger 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 ssortingng date { get; set; } } } 

C’est la List que je veux sortinger:

 List Week = new List(); 

Ce que je veux faire, c’est sortinger la liste par la propriété date de la classe cTag. La date est au format: jj.MM.aaaa.

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

Une façon de faire cela est avec un delegate

 List week = new List(); // add some stuff to the list // now sort week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); }); 

Vous avez raison de dire que votre classe cTag doit implémenter l’ IComparable . Ensuite, vous pouvez simplement appeler Sort() sur votre liste.

Pour implémenter l’ IComparable , vous devez implémenter la CompareTo(T other) . La méthode la plus simple consiste à appeler la méthode CompareTo du champ que vous souhaitez comparer, ce qui dans votre cas est la date.

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

Cependant, cela ne tiendrait pas bien, car cela utiliserait un sorting classique sur les chaînes (puisque vous avez déclaré la date sous forme de chaîne). Je pense donc que le meilleur moyen de le faire serait de redéfinir la classe et de déclarer la date non pas comme une chaîne, mais comme DateTime. Le code restrait presque le même:

 public class cTag:IComparable { 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); } } 

Seule chose que vous devez faire lors de la création de l’instance de la classe pour convertir votre chaîne contenant la date en type DateTime, mais cela peut être fait facilement, par exemple par la méthode DateTime.Parse(Ssortingng) .

Dans ce cas, vous pouvez également sortinger avec LINQ:

 week = week.OrderBy(w => DateTime.Parse(w.date)).ToList(); 
 List week = new List(); week.Sort((x, y) => DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo( DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture)) ); 

Tout d’abord, si la propriété date stocke une date, stockez-la en utilisant un DateTime. Si vous parsingz la date à travers le sorting, vous devez l’parsingr pour chaque élément comparé, ce n’est pas très efficace …

Vous pouvez ensuite créer un IComparer:

 public class TagComparer : IComparer { public int Compare(cTag first, cTag second) { if (first != null && second != null) { // We can compare both properties. return first.date.CompareTo(second.date); } if (first == null && second == null) { // We can't compare any properties, so they are essentially equal. return 0; } if (first != null) { // Only the first instance is not null, so prefer that. return -1; } // Only the second instance is not null, so prefer that. return 1; } } var list = new List(); // populate list. list.Sort(new TagComparer()); 

Vous pouvez même le faire en tant que délégué:

 list.Sort((first, second) => { if (first != null && second != null) return first.date.CompareTo(second.date); if (first == null && second == null) return 0; if (first != null) return -1; return 1; }); 

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 ne faites qu’implémenter votre algorithme de comparaison personnalisé (vous pouvez utiliser les objects DateTime pour cela, mais assurez-vous de vérifier le type de “obj” en premier). Pour plus d’informations, voir ici et ici .

Vous pouvez utiliser linq:

 var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag; List Sorted = q.ToList() 

regardez la méthode de sorting surchargée de la classe List. il y a des moyens d’y parvenir. l’un d’eux: votre classe personnalisée doit implémenter l’interface IComparable, puis vous utilisez la méthode Sort de la classe List.

Merci pour toutes les réponses rapides.

Ceci est ma solution:

 Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); }); 

Merci

YourVariable.Sort ((a, b) => a.amount.CompareTo (b.amount));