Default festlegen für .FirstOrDefault

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Default festlegen für .FirstOrDefault

    Hallo

    Wie kann ich das Ergebnis als False festlegen, falls es kein Element mit Column = "Banner" im Array gibt?
    (Sorry, hab aus Versehen auf Absenden gedrückt bevor ich fertig war, deshalb nur wenig Text zur Problemstellung. Ich hoffe ist trotzdem klar was ich möchte)

    VB.NET-Quellcode

    1. Dim test As Boolean = Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = "Banner").Hide


    VB.NET-Quellcode

    1. Public Class ListSorting
    2. #Region "Fields"
    3. Private _column As String
    4. Private _displayindex As Integer
    5. Private _hide As Boolean
    6. Private _label As String
    7. Private _missing As Boolean
    8. #End Region 'Fields
    9. #Region "Constructors"
    10. Public Sub New()
    11. Me.Clear()
    12. End Sub
    13. #End Region 'Constructors
    14. #Region "Properties"
    15. Public Property Column() As String
    16. Get
    17. Return Me._column
    18. End Get
    19. Set(ByVal value As String)
    20. Me._column = value
    21. End Set
    22. End Property
    23. Public Property DisplayIndex() As Integer
    24. Get
    25. Return _displayindex
    26. End Get
    27. Set(ByVal value As Integer)
    28. _displayindex = value
    29. End Set
    30. End Property
    31. Public Property Hide() As Boolean
    32. Get
    33. Return Me._hide
    34. End Get
    35. Set(ByVal value As Boolean)
    36. Me._hide = value
    37. End Set
    38. End Property
    39. Public Property Label() As String
    40. Get
    41. Return Me._label
    42. End Get
    43. Set(ByVal value As String)
    44. Me._label = value
    45. End Set
    46. End Property
    47. Public Property Missing() As Boolean
    48. Get
    49. Return Me._missing
    50. End Get
    51. Set(ByVal value As Boolean)
    52. Me._missing = value
    53. End Set
    54. End Property
    55. #End Region 'Properties
    56. #Region "Methods"
    57. Public Sub Clear()
    58. Me._column = String.Empty
    59. Me._displayindex = -1
    60. Me._hide = False
    61. Me._label = String.Empty
    62. Me._missing = False
    63. End Sub
    64. #End Region 'Methods
    65. End Class

    Moin,

    schaue Dir mal die ​Any-Extension an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Es scheint mir, als hättet ihr mich falsch verstanden (ich hätte wohl doch noch etwas mehr schreiben sollen).

    Im Array gibt es mehrere ListSorting Elemente, die eine Column als String und Hide als Boolean haben.
    Ich möchte nun nach einer Column suchen und vom ersten gefundenen Element im Array den Hide Wert haben. Falls aber im Array kein Element mit z.B. Column = "Banner" gefunden wird, soll False als Default verwendet werden.

    In euren Vorschlägen wird ja nur überprüft, ob ein Element vorhanden ist oder nicht.
    Ich hab das so verstanden, dass ich irgendwie mit DefaultIfEmpty den Default-Wert auf False festlegen kann, falls mit FirstOrDefault kein Element gefunden worden ist.
    Ja, das geht natürlich auch, ist bei der Menge an Columns aber zu umständlich. Ich dachte das geht direkt über DefaultIsEmpty.

    In dem Fall werde ich eine Sub dafür erstellen.

    Danke


    Trotzdem würde ich gerne verstehen, was denn das Default in FirstOrDefault heissen/nutzen soll (falls jemand die Zeit und den Willen hat). Ich hab da keine schlaue Erklärung im Netz gefunden.
    Die FirstOrDefault-Extension gibt entweder das erste Element, auf das die angegebene Bedingung zutrifft, zurück, oder den Standardwert des Rückgabetyps, falls kein solches Element gefunden wurde. Der Standardwert ist für alle Referenztypen (also Klassen, Interfaces und Delegaten) Null/Nothing und für alle Wertetypen (Strukturen und Enums) 0 in allen Feldern (kompletter Speicherbereich ist 0).
    lies, was die Doku (zB ObjectBrowser) angibt, was Enumerable(Of T).First zurückgibt, im Gegensatz zu Enumerable(Of T).FirstOrDefault.
    Und lies auch, wann es bei welcher Methode welche Exception gibt.
    Also 2 Methoden, und von jeder Methode 2 Informationen, nämlich Rückgabewert und Exceptions.

    Poste deine Erkenntnisse hier.
    Ich danke euch!

    Also in diesem Falle bei Enumerable(Of T).First:
    Rückgabewerte:
    Nur das erste Element in der angegebenen Sequenz, ansonsten Fehler.

    Ausnahmen:
    System.ArgumentNullException: source ist null. => Kein Element gefunden (?)
    System.InvalidOperationException: Die Quellsequenz ist leer. => MovieGeneralMediaListSorting.Count = 0 oder MovieGeneralMediaListSorting = Nothing (?)


    und bei Enumerable(Of T).FirstOrDefault:
    Rückgabewerte:
    default(TSource), wenn source leer ist (Werte wie oben von Artentus beschrieben), andernfalls das erste Element in source.

    Ausnahmen:
    System.ArgumentNullException: source ist null. => Kein Element gefunden (?)


    Gelöst habe ich das jetzt übrigens so:

    VB.NET-Quellcode

    1. Private Function CheckColumnHide_Movies(ByVal ColumnName As String) As Boolean
    2. Try
    3. Return Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = ColumnName).Hide()
    4. Catch ex As Exception
    5. Return False
    6. End Try
    7. End Function



    Die Farbe Rot ist der Moderation vorbehalten -> Farbe angepasst
    -Artentus

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

    DanCooper schrieb:

    System.ArgumentNullException: source ist null. => Kein Element gefunden (?)
    diese Interpretation ist falsch.
    Es ist ein erheblicher Unterschied, ob die Source null (Nothing) ist oder ob die Source kein (passendes) Element enthält.

    Ein leerer Eimer ist etwas ganz anderes als ein Eimer, der gar nicht existiert ;)

    Ansonsten wie bereits gesagt: Mach den TryCatch weg.
    Wenn der Eimer überhaupt nicht existiert, dann muss eine Exception fliegen (denn dann ist Mist gecodet), und das tut es ja auch, aber nur, wenn du den TryCatch weg lässt.
    TryCatch ist ein heißes Eisen
    So besser?

    VB.NET-Quellcode

    1. Private Function CheckColumnHide_Movies(ByVal ColumnName As String) As Boolean
    2. If Not IsNothing(Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = ColumnName)) Then
    3. Return Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = ColumnName).Hide()
    4. Else
    5. Return False
    6. End If
    7. End Function



    Die Eimer-Theorie ist und war mir eigentlich klar, keine Ahnung wieso ich das falsch hingeschrieben habe, steht ja schon source ist null da :whistling:
    Das ist uneffektiv, denn FirstOrDefault durchläuft die ganze Liste - in dieser Fassung also unnötigerweise 2 mal.
    Nimm doch einfach den Code, den ich dir gezeigt hab.



    Wichtig!
    IsNothing zeigt mir, dass du die "Deppen-Einstellungen" deines VisualStudios noch unverändert drinne hast.
    In diesem Zustand ist Vb.Net keine ernstzunehmende Programmiersprache (was es ansonsten durchaus ist).

    Also unbedingt die Videos von Visual Studio - Empfohlene Einstellungen befolgen.
    Es ist ziemlich unmöglich, objektorientiertes Programmieren vernünftig zu erlernen, wenn man die Deppen-Einstellungen beibehält. Begründung im Link.
    Viel besser, aber doppelt so ineffizent, wies sein müsste. ^^
    Kann sein, dass sowas wegoptimiert wird, aber da kannst du dich eig. auch besser selbst drum kümmern:

    VB.NET-Quellcode

    1. Private Function CheckColumnHide_Movies(ByVal ColumnName As String) As Boolean
    2. Dim column = Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = ColumnName)
    3. If column IsNot Nothing Then
    4. Return column.Hide()
    5. Else
    6. Return False
    7. End If
    8. End Function

    Beachte auch, dass IsNothing ein VB6 relikt ist, hier kann man viel besser den IsNot-Vergleichsoperator verwenden.
    Na dann kurz und knapp:

    VB.NET-Quellcode

    1. Private Function CheckColumnHide_Movies(ByVal ColumnName As String) As Boolean
    2. Dim lsColumn As Settings.ListSorting = Master.eSettings.MovieGeneralMediaListSorting.FirstOrDefault(Function(l) l.Column = ColumnName)
    3. Return If(lsColumn Is Nothing, False, lsColumn.Hide)
    4. End Function


    Stimmt VisualBasic ist noch drinnen, Strict jedoch auf On.
    Ich hab mal kurz VisualBasic deaktiviert => Fehlerlimit bei 147 Fehlern erreicht :rolleyes: . Ich werde mir das dann mal bei Gelegenheit antun...
    Tu dir das sofort an.
    General-Import raus, und dann schreib zunächstmal einfach den Deppen-Import über jede Datei: Imports Microsoft.VisualBasic - dann funktioniert alles wie gehabt.
    Aber wenn du neue Dateien anfängst, lässt du den Deppen-Import weg und fängst stattdessen richtig an.
    Das ist eben das Wesen von Grund-Einstellungen: Man fängt damit an. Und du hast mit Deppen-Einstellungen angefangen, und hast nun die Sch... am Schuh.

    Jedenfalls.
    Wenn du nun an einer bestehenden Datei weitermachst, machst du mit der Korrektur deines Deppen-Codes weiter, bevor du irgendwas anderes weiter weitermachst!.
    Dazu entfernst du den oben genannten. nun nur noch dateiweiten Deppen-Import und machst dich anhand der CompilerFehler (die dann nur noch für die Datei kommen) an die Korrekturen.
    Ziehe dazu Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen zurate, den ObjectBrowser, und poste bei Unklarheiten.

    Kennst du den ObjectBrowser überhaupt?
    VisualStudio richtig nutzen (Google ist nicht deine Mami)

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