내 목록을 정렬하고 싶습니다. 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 클래스 의 속성 별로 List를 정렬하는 것 입니다. 날짜 형식은 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))
);
답변
먼저 날짜 속성이 날짜를 저장하는 경우 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;
});
답변
당신이 맞습니다-당신은 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()