Chciałbym posortować listę według date
właściwości.
To jest moja klasa niestandardowa:
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; }
}
}
To jest to, List
co chcę sortować:
List<cTag> Week = new List<cTag>();
Chcę posortować Listę według date
właściwości klasy cTag. Data ma format: dd.MM.rrrr.
Czytałem coś o IComparable
interfejsie, ale nie wiem, jak go używać.
list.Sort((a,b) => a.date.CompareTo(b.date));
CompareTo
zostanie wdrożone.IComparable
przyznaje, że klasa będzie miała metodę, ale sposób, w jaki zrobi to porównanie, zależy od twórcy klasy. Nie jestem pewien, jak Date implementuje ICompare, ale często widziałem, jak programiści używają parametrów zamówienia, które były przekazywane do zerwania remisu, gdy wartości są równe. hthMasz rację, że Twoja klasa cTag musi implementować
IComparable<T>
interfejs. Następnie możesz po prostu zadzwonićSort()
na swoją listę.Aby zaimplementować
IComparable<T>
interfejs, musisz zaimplementowaćCompareTo(T other)
metodę. Najłatwiej to zrobić, wywołując metodę CompareTo pola, które chcesz porównać, którym w Twoim przypadku jest data.Jednak to nie posortowałoby się dobrze, ponieważ użyłoby klasycznego sortowania na łańcuchach (ponieważ zadeklarowałeś datę jako ciąg). Myślę więc, że najlepszym rozwiązaniem byłoby przedefiniowanie klasy i zadeklarowanie daty nie jako ciągu, ale jako DateTime. Kod pozostałby prawie taki sam:
Jedyne, co musiałbyś zrobić przy tworzeniu instancji klasy, aby przekonwertować swój ciąg znaków zawierający datę na typ DateTime, ale można to łatwo zrobić np
DateTime.Parse(String)
. Metodą.źródło
W tym przypadku możesz również posortować za pomocą LINQ:
źródło
źródło
Po pierwsze, jeśli właściwość date przechowuje datę, zapisz ją przy użyciu DateTime. Jeśli przeanalizujesz datę przez sortowanie, musisz przeanalizować ją dla każdego porównywanego elementu, nie jest to zbyt wydajne ...
Następnie możesz utworzyć IComparer:
Możesz to zrobić nawet jako delegat:
źródło
Masz rację - musisz wdrożyć IComparable. Aby to zrobić, po prostu zadeklaruj swoją klasę:
W CompareTo po prostu zaimplementujesz własny algorytm porównania (możesz użyć do tego obiektów DateTime, ale upewnij się, że najpierw sprawdzisz typ „obj”). Więcej informacji można znaleźć tutaj i tutaj .
źródło
IComparable<T>
prawdopodobnie byłby lepszym wyborem, ponieważ jest to zaznaczone zamiastIComparable
: msdn.microsoft.com/en-us/library/b0zbh7b6.aspxMożesz użyć linq:
źródło
spójrz na przeciążoną metodę Sort klasy List. jest na to kilka sposobów. jeden z nich: Twoja niestandardowa klasa musi zaimplementować interfejs IComparable, a następnie możesz użyć metody Sort klasy List.
źródło
Dzięki za wszystkie szybkie odpowiedzi.
To jest moje rozwiązanie:
Dzięki
źródło
źródło