Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Spring4D Collections: IEnumerable.Ordered (https://www.delphipraxis.net/204881-spring4d-collections-ienumerable-ordered.html)

Friday 9. Jul 2020 15:38

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:
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;
an der ausgegeben Reihenfolge ändert sich aber nichts.
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

Stevie 9. Jul 2020 15:49

AW: Spring4D Collections: IEnumerable.Ordered
 
Ich bin mir irgendwie nicht sicher, dass dein Comparer richtig ist, denn bei
Delphi-Quellcode:
Round(x - y)
kann da durchaus öfters mal 0 rauskommen und dann wird angenommen, die Elemente wären gleichwertig.
Außerdem ist
Delphi-Quellcode:
x-y
für Vergleich auch nicht sicher gegen Overflow - deshalb besser
Delphi-Quellcode:
Math.CompareValue
nutzen

Rollo62 9. Jul 2020 16:02

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;

Rollo62 9. Jul 2020 16:06

AW: Spring4D Collections: IEnumerable.Ordered
 
Zitat:

Zitat von Stevie (Beitrag 1469231)
auch nicht sicher gegen Overflow - deshalb besser
Delphi-Quellcode:
Math.CompareValue
nutzen

Ok richtig, ich habe mir dafür auch Helper gebastelt die zusätzlich NaN und Inf-Safe sind.
Ich denke die "normalen" Math-Funktionen sind das nicht.

Kommt aber imer drauf an wo man das nutzt, ist Performance in KO-Kriterium ?

Friday 9. Jul 2020 18:47

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 16:17 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