2011-04-25 6 views
5

게시 날짜별로 MediaItem 개체의 목록 <>을 (를) 정렬해야합니다 ... 게시 날짜가 해당 항목의 속성이 아닙니다. 그래서 내 초기 의도는 일시적으로 게시 날짜 속성을 올려 놓기, 올려주기, 정렬 및 도랑 처리하는 것이 었습니다. 누군가 내 작업에서 Tuple을 사용하고 LINQ와 정렬을 제안했습니다 ... 목록에있는 <을 채우는 지금까지 내 스 니펫 테스트에서이 작업을 수행했습니다. 그러나 다음 날짜 속성을 사용하여 정렬하는 방법을 잘 모르겠습니다. LINQ. 내 목표를 계속 지켜봐야 겠지만 누군가 도움이된다면 고맙겠습니다. 감사.C# 튜플을 사용하여 List <> 정렬?

List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

      for (int i = 0; i <= 10; i++) 
      { 
       DateTime date = new DateTime(2011, i, 1); 
       MediaItem item = new MediaItem(); 
       list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
      } 

답변

13

OrderBy() LINQ 연산자를 사용하여 정렬을 수행 할 수 있습니다. 그것은 당신이 정렬 할 원소를 추출하는 함수를 넘기는 것을 허용합니다. 튜플의 두 번째 멤버가 날짜이기 때문에 우리는 Item2을 주문합니다.

var result = list.OrderBy(x => x.Item2).ToList(); 

당신은 대신있는 OrderBy`의 OrderByDescending()를 사용하여 LINQ에서 주문을 취소 할 수 있습니다().

또한 OrderBy() 메서드는 기본적으로 지연이므로 결과를 구체화하거나 반복해야합니다. 위의 예는 목록의 사본을 나타냅니다.

새 목록을 만드는 대신 목록을 정렬하려면 Sort() 메서드에 Comparison<T> 대리자를 제공 할 수 있습니다.

list.Sort((a,b) => a.Item2.CompareTo(b.Item2)); 

그러나, 당신도 더 잘 할 수 - 당신은 항상 메인에 정렬 된 순서로 목록을 원한다면, 당신은 ... 대신 SortedList 클래스를 사용할 수 있습니다하지만 당신은 그 경우에 사용자 정의 IComparer<Tuple<MediaItem, DateTime>>을 구현해야합니다. 이 경우 항목을 추가 할 때 항상 정렬 된 순서로 유지 관리됩니다.

5

하나의 방법은 적절한 Comparison<T> 대리자를 만들 람다 표현식을 사용 List<T>.Sort 방법을 사용하는 것이다.

// Sorts tuples in chronological order. To use reverse chronological order, 
// use t2.Item2.CompareTo(t1.Item2) instead. 
list.Sort((t1, t2) => t1.Item2.CompareTo(t2.Item2)); 

물론이 목록에는 목록에 null 참조가 없다고 가정합니다. 예를 들어 그럴 수 없습니다.

+0

+1 나를 30 초나 이깁니다 .-) – BrokenGlass

2
List<Tuple<MediaItem, DateTime>> list = new List<Tuple<MediaItem, DateTime>>(); 

for (int i = 0; i <= 10; i++) 
{ 
     DateTime date = new DateTime(2011, i, 1); 
     MediaItem item = new MediaItem(); 
     list.Add(new Tuple<MediaItem, DateTime>(item, date)); 
} 

list.Sort((a, b) => a.Item2.CompareTo(b.Item2)); 

foreach (var element in list) 
{ 
    Console.WriteLine(element); 
} 
관련 문제