2016-09-08 3 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 
    }; 
} 

Мое требование гласит, что сортировка должна выглядеть следующим образом: Reg, OT, OTPrem, Alpha-то кодом.

Разъяснение на словах, если в списке содержится код «Reg», он должен быть первым, если он также содержит «OT», он должен появиться после Reg и т. Д. Все элементы, коды которых отличаются от указанных трех, должны быть отсортированы в алфавитном порядке ,

В моем примере отсортированный список должен выглядеть следующим образом: Reg, OT, OTPrem, 3PS, Bonus

Что бы самый элегантный способ для достижения этой цели? Возможно, используя 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 Большое спасибо @ ИванСтоев –

0

По мере сортировки логика является совершенно уникальным для вашей проблемы, я хотел бы предложить реализацию, интерфейс IComparer(T), а затем вызывая Sort(IComparer(T)) в вашем списке.

class MyComparer : IComparer<PayStubDetailItem> 
{ 
    public int Compare(PayStubDetailItem x, PayStubDetailItem y) 
    { 
     //Your implementation 
    } 
} 
Смежные вопросы