Сортировка списка пользовательских classов

Я хотел бы отсортировать список с date .

Это мой пользовательский class:

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

Это List который я хочу сортировать:

 List Week = new List(); 

Я хочу сделать сортировку списка по свойству date classа cTag. Дата ist в формате: dd.MM.yyyy.

Я кое-что прочитал о интерфейсе IComparable , но не знаю, как его использовать.

Один из способов сделать это – с 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); }); 

Вы правы, что ваш class cTag должен реализовать IComparable . Затем вы можете просто вызвать Sort() в своем списке.

Чтобы реализовать IComparable , вы должны реализовать метод CompareTo(T other) . Самый простой способ сделать это – вызвать метод CompareTo поля, которое вы хотите сравнить, что в вашем случае – дата.

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

Однако это не очень хорошо, потому что это будет использовать classическую сортировку по строкам (поскольку вы указали дату как строку). Поэтому я думаю, что лучше всего подумать о том, чтобы переопределить class и объявить дату не как строку, а как DateTime. Код останется почти таким же:

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

Единственное, что вам нужно было бы сделать, создав экземпляр classа для преобразования строки, содержащей дату, в тип DateTime, но это можно сделать легко, например, методом DateTime.Parse(String) .

Для этого случая вы также можете сортировать с помощью 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)) ); 

Прежде всего, если свойство date хранит дату, сохраните его с помощью DateTime. Если вы разбираете дату в сортировке, вам нужно ее разобрать для каждого сравниваемого элемента, это не очень эффективно …

Затем вы можете сделать 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()); 

Вы можете сделать это как делегат:

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

Вы правы – вам нужно реализовать IComparable. Чтобы сделать это, просто объявите свой class:

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

В CompareTo вы просто реализуете свой собственный алгоритм сравнения (вы можете использовать объекты DateTime для этого, но просто убедитесь, что сначала проверяете тип «obj»). Для получения дополнительной информации см. Здесь и здесь .

Вы можете использовать linq:

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

посмотрите на перегруженный метод сортировки classа List. есть некоторые способы этого. один из них: ваш пользовательский class должен реализовать интерфейс IComparable, а затем вы используете метод сортировки classа List.

Спасибо за все быстрые ответы.

Это мое решение:

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

благодаря

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

  • Сортировка двух NSArrays вместе бок о бок
  • Как разрешить sortedArrayUsingSelector использовать целое число для сортировки вместо String?
  • Swift - сортировка массива объектов с несколькими критериями
  • Сравнение C # и OrderBy
  • Порядок Mysql по определенным значениям идентификатора
  • Mergesort Python
  • Сортировка одного списка другим
  • Алгоритм естественной сортировки
  • Пользовательская логика сортировки в OrderBy с использованием LINQ
  • Как сортировать очень большие файлы
  • Какой алгоритм сортировки лучше всего работает в основном отсортированных данных?
  • Interesting Posts

    Почему String.split требует, чтобы разделитель строк был экранирован?

    исходный код функций c / c ++

    Могу ли я покрасить определенные слова в Документе Google с помощью Google Apps Script?

    Android: поддержка нескольких экранов

    Что на самом деле происходит с USB-накопителем, когда он умирает?

    Есть ли способ изменить профиль локальной учетной записи Windows на профиль учетной записи домена?

    Обмен данными сеанса между контекстами в Tomcat

    Синхронизировать закладки iCloud с Firefox в Windows 7

    Угловые директивы – когда и как использовать компиляцию, controller, предварительную ссылку и пост-ссылку

    Внешний жесткий диск вращается слишком рано

    Как я могу использовать «sizeof» в макросе препроцессора?

    Должен ли я использовать «Spread Spectrum Clocking» на моем новом диске Western Digital?

    Вычисление матрицы LookAt

    Angular2 – динамически загружать компонент из модуля

    IIS7: настройка встроенной проверки подлинности Windows, например, в IIS6

    Давайте будем гением компьютера.