[c#] 사용자 지정 클래스 목록 정렬 <T>

내 목록을 정렬하고 싶습니다. 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()