2010-07-02 6 views
95

Ich möchte meine Liste mit der date Eigenschaft sortieren.Sortieren einer benutzerdefinierten Klassenliste <T>

Dies ist meine eigene Klasse:

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; } 
    } 
} 

Jahr Dies ist die List, dass ich sortieren möchten:

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

Was ich tun möchte, ist eine Art der Liste der date Eigenschaft des CTAG Klasse. Das Datum ist im Format: dd.MM.yyyy.

Ich lese etwas über die IComparable Schnittstelle, aber weiß nicht, wie man es benutzt.

Antwort

118

Eine Möglichkeit, dies zu tun, ist mit einem delegate

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

Sie können auch die gleiche Sache mit einem Lambda-Ausdruck schreiben: 'list.Sort ((a, b) => a.date.CompareTo (b.date));' –

+0

@ Xavier aus irgendeinem Grund meine Meinung noch springt immer zuerst zu Prädikaten, obwohl Sie zu 100% korrekt sind, dass Ihr Lambda-Ausdruck die Aufgabe erfüllt und wahrscheinlich leichter zu lesen/zu verstehen ist. – ahsteele

+0

Wie funktioniert das, oder wie würden Sie eine Krawatte konsequent mit dem Lambda-Ausdruck brechen? Was wenn ein.date == b.date hier ist? list.Sort ((a, b) => a.date.CompareTo (b.date)); Würde dies zu Problemen beim Paging von Gittern führen und diese beiden würden auf verschiedene Seiten fallen? – TheEmirOfGroofunkistan

3

betrachten überladene Sortiermethode der List-Klasse. Es gibt einige Wege dazu. einer von ihnen: Ihre benutzerdefinierte Klasse muss IComparable Schnittstelle implementieren, dann Sie Cam verwenden Sort-Methode der List-Klasse.

5

Sie haben Recht - Sie IComparable implementieren müssen. Um dies zu tun, erklären einfach Ihre Klasse:

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

In CompareTo, die Sie gerade implementieren Ihren benutzerdefinierten Vergleichsalgorithmus (Sie können Datetime-Objekte verwenden, um dies zu tun, aber nur sicher sein, welche Art von „obj“ überprüfen zuerst) . Weitere Informationen finden Sie unter here und here.

+7

'IComparable ' wäre wahrscheinlich eine bessere Wahl, da es für 'IComparable' überprüft wird: http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx –

+0

Sie lernen etwas jeden Tag ...: o) –

10
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)) 
); 
5

Sie Linq verwenden können:

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

Sie auch LINQ Art verwendet, kann für diesen Fall:

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

Das Wichtigste zuerst, wenn das Datum-Eigenschaft ist ein Datum zu speichern, speichern Es verwendet eine DateTime. Wenn Sie das Datum durch das Sie es für jedes Element zu analysieren haben Art analysieren verglichen werden, das ist nicht sehr effizient ...

Sie dann eine IComparer machen können:

public class TagComparer : IComparer<cTag> 
{ 
    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<cTag>(); 
// populate list. 

list.Sort(new TagComparer()); 

Sie können sogar tun es als Delegierter:

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; 
      }); 
43

Sie sind richtig, dass Ihre CTAG Klasse IComparable<T> Schnittstelle implementieren müssen. Dann können Sie einfach Sort() auf Ihrer Liste anrufen. Um die IComparable<T> Schnittstelle zu implementieren, müssen Sie CompareTo(T other) Methode implementieren. Am einfachsten rufen Sie die CompareTo-Methode des Feldes auf, das Sie vergleichen möchten. In diesem Fall handelt es sich um ein Datum.

Dies würde jedoch nicht gut sortieren, da dies die klassische Sortierung von Strings verwenden würde (da Sie das Datum als String deklariert haben).Also denke ich, dass es am besten wäre, die Klasse neu zu definieren und das Datum nicht als String, sondern als DateTime zu deklarieren. Der Code würde bleiben fast gleich:

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); 
    } 
} 

Das Einzige, was Sie tun würden, wenn die Instanz der Klasse erstellen Ihre Zeichenfolge enthält das Datum in Datetime-Typ zu konvertieren, aber es kann leicht zum Beispiel durchgeführt werden von DateTime.Parse(String) Methode.

2

Danke für alle schnellen Antworten.

Dies ist meine Lösung:

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

Dank

0

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

Verwandte Themen