Ответ 1
Один из способов сделать это - 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); });
Я хотел бы отсортировать список со свойством date
.
Это мой пользовательский класс:
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<cTag> Week = new List<cTag>();
Что я хочу сделать, это отсортировать список по свойству date
класса cTag.
Дата ist в формате: dd.MM.yyyy.
Я прочитал что-то о интерфейсе IComparable
, но не знаю, как его использовать.
Один из способов сделать это - 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); });
Вы правы, что ваш класс cTag должен реализовывать интерфейс IComparable<T>
. Затем вы можете просто вызвать Sort()
в своем списке.
Чтобы реализовать интерфейс IComparable<T>
, вы должны реализовать метод CompareTo(T other)
. Самый простой способ сделать это - вызвать метод CompareTo поля, которое вы хотите сравнить, которое в вашем случае является датой.
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);
}
}
Однако это не очень хорошо, потому что это будет использовать классическую сортировку по строкам (поскольку вы указали дату как строку). Поэтому я думаю, что лучше всего подумать о том, чтобы переопределить класс и объявить дату не как строку, а как DateTime. Код останется почти таким же:
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);
}
}
Единственное, что вам нужно было бы сделать, создав экземпляр класса для преобразования строки, содержащей дату, в тип DateTime, но это можно сделать легко, например. по методу DateTime.Parse(String)
.
В этом случае вы также можете сортировать с помощью LINQ:
week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
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))
);
Вы правы - вам нужно реализовать IComparable. Для этого просто объявите свой класс:
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<cTag> Sorted = q.ToList()
Прежде всего, если свойство date хранит дату, сохраните его с помощью DateTime. Если вы анализируете дату через сортировку, вы должны ее разобрать для каждого сравниваемого элемента, что не очень эффективно...
Затем вы можете сделать IComparer:
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());
Вы можете сделать это как делегат:
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;
});
Посмотрите на перегруженный метод сортировки класса List. есть некоторые способы этого. один из них: ваш пользовательский класс должен реализовать интерфейс IComparable, а затем вы используете метод сортировки класса 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));