2016-09-08 4 views
1

Ich habe eine Liste von Elementen, die auf eine ganz bestimmte Art und Weise sortiert werden müssen.Liste benutzerdefinierte Sortierung

Nehmen Sie dieses Beispiel:

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 
    }; 
} 

Meine Forderung besagt, dass die Sortierung sollte wie folgt lauten: Reg, OT, OTPrem, Alpha-Art von Code.

Erklärt in Worten, wenn Liste 'Reg' Code enthält, sollte es zuerst kommen, wenn es auch 'OT' enthält, sollte es nach Reg, usw. kommen. Alle Artikel, die Codes von diesen spezifischen drei abweichen, sollten alphabetisch sortiert sein . Reg, OT, OTPrem, 3ps, Bonus

Was der eleganteste Weg wäre, um das zu erreichen:

In meinem Beispiel die sortierte Liste soll wie folgt aussehen? Vielleicht mit LINQ oder einem benutzerdefinierten Vergleich.

Das ist, was ich bisher versucht habe, aber es ist zu weitschweifig:

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(); 

Dank

+0

LINQ scheint gut zu sein. Hast du es versucht? –

+0

@DavidL Ich habe meine Post mit meinem aktuellen Versuch aktualisiert, aber ich mag es nicht. Es ist hässlich –

Antwort

1

können Sie verwenden Linq wie folgt aus:

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

Der OrderBy Ausdruck geben Sie die gewünschte Prioritätsreihenfolge, während der ThenBy die alphabetische Teil tun wird.

+0

Das ist, was ich mit elegant meinte! L Vielen Dank @IvanStoev –

0

Als Ihre Sortierlogik, um Ihr Problem ziemlich einzigartig ist, würde ich eine Implementierung die IComparer(T) Schnittstelle vorschlagen und dann Rufen Sie Sort(IComparer(T)) auf Ihrer Liste.

class MyComparer : IComparer<PayStubDetailItem> 
{ 
    public int Compare(PayStubDetailItem x, PayStubDetailItem y) 
    { 
     //Your implementation 
    } 
} 
Verwandte Themen