У меня есть список предметов, которые нужно сортировать очень определенным образом.Список Пользовательский Сортировка
Возьмем такой пример:
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();
Благодаря
LINQ выглядит просто отлично. Ты это пробовал? –
@DavidL Я обновил свое сообщение с помощью моей текущей попытки, но мне это не нравится. Это уродливо –