Return Linq Iterator

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    Return Linq Iterator

    Hm, bin mir nicht ganz sicher ob ich etwas offensichtliches übersehe, aber mir ist nicht klar wie man einen Linq iterator zurückgeben kann.
    Folgendes Bsp:

    C#-Quellcode

    1. var stuff = _items.Max(item => item.DetectValue());


    Dieser Aufruf iteriert in _items, prüft holt sich von allen den Wert von DetectValue() und gibt davon den größten zurück.
    Wie kann ich aber das item/iterator selbst zurückbekommen, bei dem Detectvalue den höchsten Wert hat, anstatt nur des Wertes selbst?
    C# Developer
    Learning C++
    Vielleicht n bisken Rücken-Brust-Auge, aber:

    VB.NET-Quellcode

    1. Dim stuff = _items.First(Function(x) x.DetectValue = _items.Max(Function(y) y.DetectValue))
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    C#-Quellcode

    1. items.Aggregate((a,b) => Math.Max(a,b));

    Viele vergessen die Aggregate Funktion ;) Damit kann man auch Sum etc. nachprogrammieren^^

    Edit: und mir ist grad aufgefallen, das dir das irgendwie ja überhaupt nichts bringt :D

    Aber mal anders gefragt? Warum? Um ein sinnvolles ergebnis bei Max zu bekommen müssen sowieso generell alle iteriert werden. Und wenn du denn suchbereich eingrenzen möchtest dann sollte das vor dem maximieren passieren, oder was überseh ich da?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jvbsl“ ()

    Das ist tatsächliche eine "Lücke" (naja man kann ja nicht alles haben). Bei dem Projekt MoreLINQ gibt es diese Funktionen unter dem Namen MaxBy und MinBy, da auch schon andere auf dieses Problem gestoßen sind.

    Edit:

    jvbsl schrieb:

    Aber mal anders gefragt? Warum?

    Stell dir vor du hast eine Liste mit Autos und willst das Auto mit dem höchsten Gewicht, da bringt es dir nix, dass du mit Max 5,43 Tonnen bekommst, du willst das Auto, welches 5,43 Tonnen hat?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bluespide“ ()

    Ja Aggregate tät ich auch nehmen.

    VB.NET-Quellcode

    1. Dim stuff = _items.Aggregate(Function(a, b) If(a.DetectValue > b.DetectValue, a, b))
    2. Debug.WriteLine(stuff.DetectValue())

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @NoIde @Bluespide @VaporiZed Das problem mit diesen Ansätzen ist das die DetectValue Funktionen mehrfach aufgerufen werden.
    Um auf das Auto Beispiel Bluespide zurückzugreifen: Stell dir vor du hast 3 Autos in _items.
    Audi mit DetectValue 0, VW mit DetectValue 1, Mercedes mit DetectValue 2.

    Wenn ich das dann wie folgt ausführe:

    C#-Quellcode

    1. var car = _items.Aggregate((a, b) => a.DetectValue() > b.DetectValue() ? a : b);
    2. Console.WriteLine(stuff.Name);


    Dann wird DetectValue von Audi 1 mal aufgerufen, von VW 2 mal und von Mercedes 2 mal.
    Das sollte doch eigentlich nicht notwendig sein oder?
    C# Developer
    Learning C++
    Nur bei VW würde doch die function 2 mal gecallt.

    AUDI - VW
    VW - MERCEDES

    Bei 3 Items "läufts" 2 mal durch, also bei allen Items mit Index > 0 und < List.Count-1 werden die Funktionen 2 mal gecallt.

    Wobei ich da auch noch ein Problem sehe, was wenn Audi und VW bei DetectValue 1 rausgeben würden? Auch bei @VaporiZed s Code wegen des First

    Vllt. ist es sinnvoll, alle Items mit dem höchsten vorkommenden Wert zu hohlen.

    VB.NET-Quellcode

    1. Dim stuff = _items.Where(Function(a) a.DetectValue = _items.Max(Function(b) b.DetectValue))

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Rikudo schrieb:

    Hm, bin mir nicht ganz sicher ob ich etwas offensichtliches übersehe, aber mir ist nicht klar wie man einen Linq iterator zurückgeben kann.
    Folgendes Bsp:

    C#-Quellcode

    1. var stuff = _items.Max(item => item.DetectValue());


    Dieser Aufruf iteriert in _items, prüft holt sich von allen den Wert von DetectValue() und gibt davon den größten zurück.
    Wie kann ich aber das item/iterator selbst zurückbekommen, bei dem Detectvalue den höchsten Wert hat, anstatt nur des Wertes selbst?
    Deine Fragestellung verwendet völlig falsche Begriffe, und ist daher nur richtig zu verstehen, wenn man sie falsch versteht.
    ZB ein Iterator ist nichts, was man zurückgeben kann. Iterator ist ein vb.net - Schlüsselwort, welches ein bestimmtes erstaunliches Verhalten von Code bewirkt.
    Zurückgeben kann man aber nur Datentypen.
    Und einen Linq-Iterator gibts schoma garnet.

    Immerhin das hier:
    Wie kann ich aber das item/iterator selbst zurückbekommen, bei dem Detectvalue den höchsten Wert hat, anstatt nur des Wertes selbst?
    ist die korrekt gestellte Frage.
    Habe ich hier beantwortet: verbesserte AggregatFunktion für Linq-Max / Linq-Min

    Lustig finde ich post#4, wo BlueSpide drauf aufmerksam macht, dass andere das inzwischen auch erfunden haben.