AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C#] Wie Liste mithilfe weiterer Liste sortieren?
Thema durchsuchen
Ansicht
Themen-Optionen

[C#] Wie Liste mithilfe weiterer Liste sortieren?

Ein Thema von Matze · begonnen am 18. Dez 2009 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[C#] Wie Liste mithilfe weiterer Liste sortieren?

  Alt 18. Dez 2009, 21:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#2

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

  Alt 18. Dez 2009, 21:59
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
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 18. Dez 2009, 22:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#4

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

  Alt 18. Dez 2009, 22:08
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
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

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

  Alt 18. Dez 2009, 22:12
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 18. Dez 2009, 22:16
"Co2-Erwärmung" ist ein interessanter Begriff.

@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
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#7

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

  Alt 18. Dez 2009, 22:28
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
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#8

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

  Alt 18. Dez 2009, 22:31
Zitat von Christian S.:
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) } );
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#9

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

  Alt 18. Dez 2009, 22:33
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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 18. Dez 2009, 22:47
Tatsache, das ist genial. Ich wusste nicht, dass man mit Sort() auch Werte aus anderen Listen vergleichen kann.
Herzlichen Dank euch beiden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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