[C#] Wie Liste mithilfe weiterer Liste sortieren?
Hallo,
ich habe eine Liste, die aus Instanzen besteht.
Code:
"myClass" enthält "Variablen" wie "Vorname", "Nachname" und "id", also myList.Vorname, myList.Nachname und myList.id. Die id entspricht dem Index der Liste.
List<myClass> myList = new List<myClass>();
Zusätzlich habe ich eine weitere Liste, die eine Auswahl von IDs von "myList" enthält:
Code:
Nun möchte ich mySmallList mithilfe von MyList sortieren.
List<int> mySmallList = new List<int>();
Beispiel: MyList könnte 5 Einträge haben, beispielsweise diese:
Code:
MySmallList könnte 3 Einträge beinhalten, beispielsweise so:
myList[0].Vorname = "Hans";
myList[1].Vorname = "Hugo"; myList[2].Vorname = "Fritz"; myList[3].Vorname = "Dieter"; myList[4].Vorname = "Werner";
Code:
MySmallList soll nun so sortiert werden, dass die Vornamen der zugehörigen Einträge in myList aufsteigend (oder absteigend) sortiert sind. Das Ergebnis soll demnach das hier sein:
MySmallList[0] = 0; // Hans
MySmallList[1] = 3; // Dieter MySmallList[2] = 4; // Werner
Code:
Mit Sort() komme ich vermutlich nicht weiter, da ich zur Sortierung beide Listen benötige.
MySmallList[0] = 3; // Dieter
MySmallList[1] = 0; // Hans MySmallList[2] = 4; // Werner Wie kann ich das denn möglichst performant sortieren? Meine Überlegung war der Weg über eine weitere Liste, doch das kommt mir unsauber und langsam vor bei vielen Einträgen:
Code:
Alle Codes ungetestet, aber das Prinzip sollte klar werden.
List<myClass> tempList = new List<myClass>(MySmallList.Count);
foreach (int id in mySmallList) { tempList.Add(myList[id]); } tempList.Sort(/* ... */); MySmallList.Clear(); foreach (myClass entry in tempList) { MySmallList.Add(entry.id); } tempList.Clear(); Grüße, Matze |
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Hallo!
Ich habe es gerade mal in Prism ausprobiert, in C# geht's ja dann in grün:
Delphi-Quellcode:
Wichtig ist, dass die System.Core.dll referenziert wird und System.Linq in den using-Klauseln steht.
var myList := new List<MyClass>;
myList.AddRange([new MyClass(Vorname := 'Hans'), new MyClass(Vorname := 'Hugo'), new MyClass(Vorname := 'Fritz'), new MyClass(Vorname := 'Dieter'), new MyClass(Vorname := 'Werner')]); var mySmallList := new List<Integer>; mySmallList.AddRange([0,3,4]); for m in mySmallList do //unsortiert ausgeben Console.WriteLine(myList[m].Vorname); var newList := mySmallList.OrderBy(i -> myList[i].Vorname); for n in newList do //sortiert ausgeben Console.WriteLine(myList[n].Vorname); Console.ReadLine(); Grüße Christian |
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Hallo Christian,
dankeschön. Nur ob ich das verwende, weiß ich nicht genau. Denn dann bräuchte ich nur dafür als Voraussetzung .NET 3.5 und bisher komme ich mit 2.0 aus. Ich teste aber mal etwas herum. Grüße, Matze |
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Mir ist auch gerade eingefallen, wie es ganz ohne .NET 3.5 geht und ohne LINQ und ohne CO2-Erwärmung und so ;-)
Delphi-Quellcode:
Den Lambda-Ausdruck kannst Du auch also anonymen Delegate schreiben, das kann auch C# 2.0 :-)
var myList := new List<MyClass>;
myList.AddRange([new MyClass(Vorname := 'Hans'), new MyClass(Vorname := 'Hugo'), new MyClass(Vorname := 'Fritz'), new MyClass(Vorname := 'Dieter'), new MyClass(Vorname := 'Werner')]); var mySmallList := new List<Integer>; mySmallList.AddRange([0,3,4]); for m in mySmallList do Console.WriteLine(myList[m].Vorname); mySmallList.Sort((x,y) -> myList[x].Vorname.CompareTo(myList[y].Vorname)); for m in mySmallList do Console.WriteLine(myList[m].Vorname); Console.ReadLine(); //edit: Vielleicht bei dem Compare-Dingens noch Checks auf null / nil einbauen ;-) |
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Zitat:
|
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
"Co2-Erwärmung" ist ein interessanter Begriff. :stupid:
@Christian: Ich verstehe zwar nicht, wie die Syntax der Sort()-Zeile bei mir aussehen würde, aber das sieht bei dir vielversprechend aus. @Sebby: Auf externe Dlls nur für diese "simple" Sortierung möchte ich nicht zurückgreifen. Grüße, Matze |
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Ich glaube, das müsste irgendwie so aussehen in C# und ohne Lambda-Ausdrücke (weil ich nicht weiß, ob C# 2.0 die schon hatte):
Code:
Die null-Checks fehlen immer noch ;-)
mySmallList.Sort(delegate(int x, int y) {return myList[x].Vorname.CompareTo(myList[y].Vorname);});
|
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Zitat:
Code:
mySmallList.Sort(delegate(int x, int y) { return myList[x].Vorname.CompareTo(myList[y].Vorname) } );
|
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Zitat:
|
Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
Tatsache, das ist genial. Ich wusste nicht, dass man mit Sort() auch Werte aus anderen Listen vergleichen kann.
Herzlichen Dank euch beiden. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz