AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Spring4D Collections: IEnumerable.Ordered

Spring4D Collections: IEnumerable.Ordered

Ein Thema von Friday · begonnen am 9. Jul 2020 · letzter Beitrag vom 9. Jul 2020
Antwort Antwort
Friday

Registriert seit: 6. Mai 2008
55 Beiträge
 
Delphi XE3 Professional
 
#1

Spring4D Collections: IEnumerable.Ordered

  Alt 9. Jul 2020, 15:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.729 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Spring4D Collections: IEnumerable.Ordered

  Alt 9. Jul 2020, 15:49
Ich bin mir irgendwie nicht sicher, dass dein Comparer richtig ist, denn bei Round(x - y) kann da durchaus öfters mal 0 rauskommen und dann wird angenommen, die Elemente wären gleichwertig.
Außerdem ist x-y für Vergleich auch nicht sicher gegen Overflow - deshalb besser Math.CompareValue nutzen
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.691 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Spring4D Collections: IEnumerable.Ordered

  Alt 9. Jul 2020, 16:02
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;
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
2.691 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Spring4D Collections: IEnumerable.Ordered

  Alt 9. Jul 2020, 16:06
auch nicht sicher gegen Overflow - deshalb besser 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 ?
  Mit Zitat antworten Zitat
Friday

Registriert seit: 6. Mai 2008
55 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Spring4D Collections: IEnumerable.Ordered

  Alt 9. Jul 2020, 18:47
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf