LINQ: eine Liste anhand einer anderen Liste sortieren

Ich hatte vor kurzem eine „kleine“ Herausforderung zu lösen: Als Input hatte ich eine Liste A mit Primärschlüsseln und ich sollte eine Liste B mit den dazugehörigen Objekten zurückliefern – aber in der gleichen für mich nicht nachvollziehbaren Reihenfolge wie ihre Id in Liste A erscheinen.

Die Aufgabe wäre nicht der Rede wert wenn man nach einem bestimmten Feld sortieren könnte. In dem Fall gäbe es genügend Möglichkeiten um ein Order By in LINQ oder schon in SQL durchzuführen.

 
Ein JOIN als Lösung
Auf Stackoverflow fand ich eine Antwort von Simon D die mir den Weg zeigte. Ein einfacher JOIN in LINQ löst das Problem auf eine sehr elegante Weise:

var orderedByIDList = from i in ids 
                       join o in objectsWithIDs
                       on i equals o.ID
                       select o;

 
Ein Beispiel
Um die Lösung in Aktion zu sehen habe ich diesen kleinen Code-Schnipsel zusammengestellt. Eine Liste von Personen soll nach ihren Id’s sortiert werden, so wie sie in der Liste filter festgelegt wurden. Um Daten nicht aus einer DB holen zu müssen dient die Methode GetSampleData() als Datengenerator.

void Main()
{
        List<long> filter = new List<long>(){1,3,2};
        List<Person> result = Person.GetSampleData();
        result.Dump();
        
        var orderedResult = from f in filter join r in result on f equals r.Id select r;
        orderedResult.Dump();        
}

public class Person 
{
        public long Id;
        public string LastName;
        public string FirstName;
        
        public static List<Person> GetSampleData()
        {
                List<Person> data = new List<Person>(){
                        new Person(){Id = 1, LastName = "Vettel", FirstName = "Sebastian"},
                        new Person(){Id = 2, LastName = "Massa", FirstName = "Felipe"},
                        new Person(){Id = 3, LastName = "Hamilton", FirstName = "Lewis"},
                };
                
                return data;
        }
}

Gibt man dieses Beispiel in LINQPad als „C# Program“ (bei Language) ein, wird die Liste bei der 2. Ausgabe entsprechend verändert:

 
Fazit
Man sollte auch kleine Probleme nutzen um sein Wissen auszubauen. LINQ bietet einem die Möglichkeit erstaunliche Ansätze zu einer Lösung zu kombinieren und Probleme aus einem ganz anderen Blickwinkel anzugehen. Und Stackoverflow ist ein idealer Anlaufort für solche Probleme.