2016-09-08 5 views
1

매우 특별한 방법으로 정렬해야하는 항목 목록이 있습니다.목록 사용자 지정 정렬

이 예제를 보자

public class PayStubDetailItem 
{ 
    public string Code { get; set; } 
} 

void Main() 
{ 
    var bonus = new PayStubDetailItem() { Code = "Bonus" }; 
    var ot = new PayStubDetailItem() { Code = "OT"}; 
    var reg = new PayStubDetailItem() { Code = "Reg"}; 
    var otPrem = new PayStubDetailItem() { Code = "OTPrem"}; 
    var tps = new PayStubDetailItem() { Code = "3ps"}; 

    var list = new List<PayStubDetailItem> { 
     bonus, ot, reg, otPrem, tps 
    }; 
} 

내 요구 사항은 상태가 다음과 같이해야한다 정렬 : 등록, OT, OTPrem, 알파 - 종류의 코드.

단어 목록에 'Reg'코드가 포함되어 있으면 'OT'가 포함되어있는 경우 Reg 다음에 오는 것이 좋습니다. 모든 특정 코드는 알파벳 순으로 정렬해야합니다 . 내 예에서

정렬 된 목록은 다음과 같아야합니다 등록, OT, OTPrem, 3PS, 보너스

이 무슨을 달성하는 가장 우아한 방법이 될 것이다? 아마도 LINQ 또는 사용자 지정 비교자를 사용합니다.

내가 지금까지 시도한 것입니다하지만 자세한에있다 :

var subList = list.Where(i => i.Code != "OT" && i.Code != "Reg" && i.Code != "OTPrem"); 
subList = subList.OrderBy(l => l.Code); 
var newList = new List<PayStubDetailItem>(); 
if (list.Select(c => c.Code).Contains("Reg")) 
{ 
    newList.Add(list.Where(i => i.Code == "Reg").FirstOrDefault()); 
} 
if (list.Select(c => c.Code).Contains("OT")) 
{ 
    newList.Add(list.Where(i => i.Code == "OT").FirstOrDefault()); 
} 
if (list.Select(c => c.Code).Contains("OTPrem")) 
{ 
    newList.Add(list.Where(i => i.Code == "OTPrem").FirstOrDefault()); 
} 
newList.AddRange(subList); 
newList.Dump(); 

감사

+0

LINQ는 괜찮아 보입니다. 너 해봤 어? –

+0

@DavidL 내 게시물을 현재 시도로 업데이트했지만 마음에 들지 않습니다. 그것은 추한 것 –

답변

1

이 같은 Linq를 사용할 수 있습니다 :

var result = list. 
    .OrderBy(c => c.Code == "Reg" ? 0 : c.Code == "OT" ? 1 : c.Code == "OTPrem" ? 2 : 3) 
    .ThenBy(c => c.Code) 
    .ToList(); 

OrderBy 표현 당신에게 필요한 우선 순위를 줄 것이라고 ThenBy는 알파벳 부분을 할 것입니다 동안.

+0

이것은 내가 우아하게 의미했던 것이다! l 고맙습니다. @IvanStoev –

0

당신의 정렬 로직이 문제에 대한 매우 독특한, 나는이 구현에게 IComparer(T) 인터페이스를 제안하고 귀하의 목록에 전화 Sort(IComparer(T)).

class MyComparer : IComparer<PayStubDetailItem> 
{ 
    public int Compare(PayStubDetailItem x, PayStubDetailItem y) 
    { 
     //Your implementation 
    } 
} 
관련 문제