Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C#] Wie Liste mithilfe weiterer Liste sortieren? (https://www.delphipraxis.net/144887-%5Bc-%5D-wie-liste-mithilfe-weiterer-liste-sortieren.html)

Matze 18. Dez 2009 20:35


[C#] Wie Liste mithilfe weiterer Liste sortieren?
 
Hallo,

ich habe eine Liste, die aus Instanzen besteht.

Code:
List<myClass> myList = new List<myClass>();
"myClass" enthält "Variablen" wie "Vorname", "Nachname" und "id", also myList.Vorname, myList.Nachname und myList.id. Die id entspricht dem Index der Liste.

Zusätzlich habe ich eine weitere Liste, die eine Auswahl von IDs von "myList" enthält:

Code:
List<int> mySmallList = new List<int>();
Nun möchte ich mySmallList mithilfe von MyList sortieren.

Beispiel:

MyList könnte 5 Einträge haben, beispielsweise diese:

Code:
myList[0].Vorname = "Hans";
myList[1].Vorname = "Hugo";
myList[2].Vorname = "Fritz";
myList[3].Vorname = "Dieter";
myList[4].Vorname = "Werner";
MySmallList könnte 3 Einträge beinhalten, beispielsweise so:

Code:
MySmallList[0] = 0; // Hans
MySmallList[1] = 3; // Dieter
MySmallList[2] = 4; // Werner
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:

Code:
MySmallList[0] = 3; // Dieter
MySmallList[1] = 0; // Hans
MySmallList[2] = 4; // Werner
Mit Sort() komme ich vermutlich nicht weiter, da ich zur Sortierung beide Listen benötige.
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:
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();
Alle Codes ungetestet, aber das Prinzip sollte klar werden.

Grüße, Matze

Christian S. 18. Dez 2009 20:59

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:
  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();
Wichtig ist, dass die System.Core.dll referenziert wird und System.Linq in den using-Klauseln steht.

Grüße
Christian

Matze 18. Dez 2009 21:06

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

Christian S. 18. Dez 2009 21:08

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:
  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();
Den Lambda-Ausdruck kannst Du auch also anonymen Delegate schreiben, das kann auch C# 2.0 :-)

//edit: Vielleicht bei dem Compare-Dingens noch Checks auf null / nil einbauen ;-)

Phoenix 18. Dez 2009 21:12

Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
 
Zitat:

Zitat von Matze
dankeschön. Nur ob ich das verwende, weiß ich nicht genau. Denn dann bräuchte ich nur dafür als Voraussetzung .NET 3.5

Quatsch mit Soße ;-) Du legst einfach die System.Core.dll von Mono dazu und schon funktioniert das auch mit .NET 2.0.

Matze 18. Dez 2009 21:16

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

Christian S. 18. Dez 2009 21:28

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:
            mySmallList.Sort(delegate(int x, int y) {return myList[x].Vorname.CompareTo(myList[y].Vorname);});
Die null-Checks fehlen immer noch ;-)

Phoenix 18. Dez 2009 21:31

Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
 
Zitat:

Zitat von Christian S.
Delphi-Quellcode:
mySmallList.Sort((x,y) -> myList[x].Vorname.CompareTo(myList[y].Vorname));

Code:
mySmallList.Sort(delegate(int x, int y) { return myList[x].Vorname.CompareTo(myList[y].Vorname) } );

Phoenix 18. Dez 2009 21:33

Re: [C#] Wie Liste mithilfe weiterer Liste sortieren?
 
Zitat:

Zitat von Christian S.
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)

Nein, es gab da noch keine Lambdas. C# war Oxygene halt schon damals technologisch weit hinterher :zwinker:

Matze 18. Dez 2009 21:47

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.
Seite 1 von 2  1 2      

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