List(Of T) alle Objekte auf Nothing prüfen mit LINQ

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Structure ... kannst du nicht auf Nothing prüfen

    Kevin Hombre schrieb:

    Artentus das ist mir schon klar, sonst hätte ich ja hier nicht nachgefragt.
    Es ist dir nicht klar, sonst hättest du ja hier nicht nachgefragt.

    Und mir ist jetzt deine wirkliche Frage nicht mehr klar.

    Kevin Hombre schrieb:

    wobei T eine eigene Structure
    Eine Structure ist ein Value-Type, kein Referenz-Typ. Da kommt kein Nothing zurück.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: Setze ein ? hinter alle Verwendungen von aaa und es könnte funktionieren. ;)
    Das wird dann zu Nullable(Of T) gemappt. Du hast dann zwar keine List(Of aaa) mehr, sondern eine List(Of Nullable(Of aaa)). Aber hey, augenscheinlich sieht es so aus, als könnte die Structure wirklich Nothing sein. ;)
    Man könnte auch einfach aaa zu einer Klasse machen. :P
    Von meinem iPhone gesendet

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

    nikeee13 schrieb:

    und es könnte funktionieren.
    Mir ist das klar. :D
    Allerdings glaube ich, dass @Kevin Hombre: da ein paar Veerständnisschwierigkeiten hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hatte auch als erstes an Nullable gedacht, aber wenn die Typen vorgegeben sind, macht's keinen Sinn. Ich verzichte bei nach außen sichtbaren Typen grundsätzlich auf Nullable usw. Normalerweise wählt man bei Werten, die Null annehmen können eine Klasse, keine Structure. Nullable(Of T) stellt einen Spezialfall dar, der entsprechend anders gehandhabt werden müsste.
    Structures werden auf dem Stapel angelegt. Aber was wäre Null auf dem Stapel? Das gibt's einfach nicht, da auf dem Stapel für die Structures ein Speicherbereich angelegt werden muss. Daher werden die Werte vom Standardkonstruktor einfach mit 0-Bytes gefüllt. Im Gegensatz dazu stehen Klassen im Heap. Structures haben bspw. den Vorteil, dass sie sich bei Wertübergaben nicht verändern (nicht mit Referenzen verwechseln) und dass für sie nicht erst Speicher anglegt werden muss. Ersteres lässt sich zum Beispiel bei Rekursion gut verwenden, wenn eine Struktur gebildet werden soll, die sich intern verändern kann, aber deren Wert im übergeordneten Aufrufer nicht verändert wird (z.B. ein Stapel, bei denen aufgerufene Werte neue Werte einreihen können und die dann nach oben nicht behalten werden sollen). Der Zugriff und das Anlegen auf Structures ist meist schneller, als auf Klassen, aber man soll sie klein halten.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Hi
    Dim contains As Boolean = Aggregate p In lst Where p <> Nothing Into Any()
    In VB gibts offenbar kein default(<Typ>) daher verwendet man Nothing dafür.



    Die Lösung ist richtig gut gedacht, aber was mir Vb dann sagt:

    Expression of type 'JLibBeta.JLib.ExtendedUserr' is not queryable.
    Make sure you are not missing an assembly reference and/or namespace import for the LINQ provider.


    Der Code ist so:

    VB.NET-Quellcode

    1. Dim eui As New JLib.JappyUser
    2. eui.Age = 0
    3. eui.Fans = 0
    4. eui.FlirtState = "-"
    5. eui.Gender = "-"c
    6. eui.IsOnline = False
    7. eui.LastActivity = "-"
    8. eui.MiniPic = My.Resources.NoPic
    9. eui.Name = "-"
    10. eui.OnlineState = "-"
    11. eui.Origin = "-"
    12. eui.Partner = "-"
    13. eui.Pic = My.Resources.NoPic
    14. eui.Prename = "-"
    15. eui.ProfileVisiterCount = 0
    16. eui.Rank = 0



    Es kann jetzt vorkommen, dass eine Eigenschaft beispielsweise Partner Nothing ist.

    Im folgenden Code möchte ich nämlich mit diesen Daten einen asynchronen Invoke vornehmen.

    Dazu habe ich ein Objectarray welches so aussieht:

    VB.NET-Quellcode

    1. Dim m(10) As Object

    Weise ich jetzt m(9) eui.Partner zu und Partner ist Nothing -> bekomme ich eine Exception, weil Nothing übergeben.


    Wie kann ich das vernünftig machen?

    Kevin Hombre schrieb:

    Wie kann ich das vernünftig machen?
    Pack das in eine Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Falls es für die Structureprüfung auf Nothing doch eine Lösung gibt, wäre ich daran interessiert.

    Ich machs dann mal vorübergehend erstmal mit einer Klasse.

    Danke für die Antworten!

    Den Sinn von einer Structure habe ich dann aber irgendwie nicht ganz verstanden.

    Structures bringen ja dann nur potenzielle Fehlerquellen, weil Variablen der Structure Nothing annehmen können, auch Stringvariablen.
    Picoflop hat mal gesagt, dass man Structures nur da verwenden soll wo man sich auch zu 110% sicher ist was man tut. In allen anderen Fällen eine Klasse schreiben. Klassen bieten weiterhin auch viel mehr Möglichkeiten als Structures.