![]() |
Spring4D Collections: IEnumerable.Ordered
Hallo,
meine Problemstellung: Ich habe eine IList<IMyItem>, von der ich mittels der Where Funktion ein IEnumerable<IMyItem> zurück bekomme. Dieses Ergebnis möchte ich nun sortieren, bzw. in einer definierten Reihenfolge die IMyItems abrufen. Ich hatte angenommen, dass es folgend funktioniert:
Delphi-Quellcode:
an der ausgegeben Reihenfolge ändert sich aber nichts.
var EM: IEnumerable<IMyItem>;
aMI: IMyItem; begin EM := MyList.Where(...); // MyList = IList<IMyItem> if (EM <> nil) and (EM.count > 0) then for aMI in EM.Ordered(function (const L, R: IMyItem): integer begin Result := round(R.MyVal - L.MyVal); end) do showmessage(IntToStr(aMI.MyVal)); end; Wie geht das direkt mit IEnumerable? Oder muss ich dazu das Ergebnis aus der Where Abfrage in eine eigene Liste kopieren und diese Liste mit Sort() sortieren? danke schonmal |
AW: Spring4D Collections: IEnumerable.Ordered
Ich bin mir irgendwie nicht sicher, dass dein Comparer richtig ist, denn bei
Delphi-Quellcode:
kann da durchaus öfters mal 0 rauskommen und dann wird angenommen, die Elemente wären gleichwertig.
Round(x - y)
Außerdem ist
Delphi-Quellcode:
für Vergleich auch nicht sicher gegen Overflow - deshalb besser
x-y
Delphi-Quellcode:
nutzen
Math.CompareValue
|
AW: Spring4D Collections: IEnumerable.Ordered
Ich denke das Sign vielleicht helfen könnte,
obwohl ich auch denke das es mit -1 < 0 > +1 funktionieren sollte.
Delphi-Quellcode:
Uses
System.Math ; procedure Test; var LSign: Integer; begin LSign := Sign( Round(-100.01) ); // -1 LSign := Sign( Round( 0.01) ); // 0 LSign := Sign( Round(+100.01) ); // +1 end; |
AW: Spring4D Collections: IEnumerable.Ordered
Zitat:
Ich denke die "normalen" Math-Funktionen sind das nicht. Kommt aber imer drauf an wo man das nutzt, ist Performance in KO-Kriterium ? |
AW: Spring4D Collections: IEnumerable.Ordered
danke, ja das war nicht aufmerksam genug aus einer anderen Stelle des Codes der mit integer arbeitet kopiert. Mit integer (oder floats die sich um mindestens 0.5 unterschieden) geht es wie ich es geschrieben habe (auch ohne sign). Aber in meinem Fall hatte ich tatsächlich sehr kleine Floatwerte. :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz