List (Of String) erweitern

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    List (Of String) erweitern

    Moin!

    ich möchte eine Funktion erstellen die an eine List (of String) einen weiteren Eintrag anhängt und dann zurück gibt.

    VB.NET-Quellcode

    1. Private Function AddAdminGroup(Groups As List(Of String)) As List(Of String)
    2. Return Groups.Add("ADMIN")
    3. End Function


    Ich bekomme aber die Meldung

    "Der Ausdruck ergibt keinen Wert".

    Das verstehe ich nun gar nicht!

    Kann mir einer weiterhelfen?

    Gruß Jan
    Die List<T>.Add(T) Method hat kein Rückgabewert.
    Somit sollte deine Funktion so aussehen.

    VB.NET-Quellcode

    1. Private Function AddAdminGroup(Groups As List(Of String)) As List(Of String)
    2. Groups.Add("ADMIN")
    3. Return Groups
    4. End Function


    Du könntest aber auch eine Prozedur mit ByRef machen.

    VB.NET-Quellcode

    1. Private Sub AddAdminGroup(ByRef Groups As List(Of String))
    2. Groups.Add("ADMIN")
    3. End Sub

    HenryV schrieb:

    Private Sub AddAdminGroup(ByRef Groups As List(Of String))
    Groups.Add("ADMIN")
    End Sub
    Ist schon mal ein ganz guter Ansatz.
    Ich würde sogar noch weiter gehen und eine Extension daraus machen

    VB.NET-Quellcode

    1. <System.Runtime.CompilerServices.Extension()> Public Sub AddAdmin(Groups As List(Of String))
    2. If Not Groups.Contains("ADMIN") Then Groups.Add("ADMIN")
    3. End Sub

    Oder auch eine, die beliebige Strings hinzufügen kann.

    VB.NET-Quellcode

    1. <System.Runtime.CompilerServices.Extension()> Public Sub AddUnique(Groups As List(Of String), Item As String)
    2. If Not Groups.Contains(Item) Then Groups.Add(Item)
    3. End Sub

    Aufruf:

    VB.NET-Quellcode

    1. Dim Groups As New List(Of String)
    2. ...
    3. Groups.AddAdmin
    4. Groups.AddUnique("ADMIN")
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    btw: Das ByRef ist in beiden Fällen unnötig.
    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.
    Eine Kleinigkeit zum Thema: »Das Objekt wird doch eh ByRef übergeben.« - eine Formulierung, die ich auch schon ein paar Mal verwendet habe. Zu Unrecht!
    Warum zu Unrecht?

    Wäre dem so, würde das folgende funktionieren. Ist entstanden, weil ich ein Dateiparsing gemacht habe, bei der neue Objekte erzeugt werden. Da aufgrund des Programmaufbaus immer nur eine Dateizeile ausgewertet wird, springt der Compiler zwischen 2 Funktionen hin- und her. Eine Variable vom Typ TestClass wird dabei an die Funktion FillWithData übrgeben und in dieser ggf. instanziiert und mit Daten befüllt.

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private ReadOnly TestList As New List(Of TestClass)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim TestClassInstance As TestClass = Nothing
    5. Dim FileLines = IO.File.ReadAllLines("Data.txt")
    6. For i = 0 To FileLines.Count - 1
    7. FillWithData(TestClassInstance, FileLines(i))
    8. Next
    9. End Sub
    10. Private Sub FillWithData(Instance As TestClass, Line As String)
    11. If Line.StartsWith("1.: ") Then
    12. TestList.Add(New TestClass With {.Name = Line.Substring(4)})
    13. Instance = TestList.Last
    14. ElseIf Line.StartsWith("2.: ") Then
    15. Instance.TestText = Line.Substring(4)
    16. ElseIf Line.StartsWith("3.: ") Then
    17. Instance.TestNumber = Integer.Parse(Line.Substring(4))
    18. End If
    19. End Sub
    20. End Class
    21. Public Class TestClass
    22. Public Name As String
    23. Public TestText As String
    24. Public TestNumber As Integer
    25. End Class


    Das geht aber nicht! Die Klasseninstanz, die als Parameter reingereicht wird, wird eben nicht ByRef übergeben. Ich wunderte mich, warum der Compiler mir Zeile#16 anmeckert, weil Instance überflüssig sei. Da wird zwar die lokale Variable Instance verändert, aber nicht die reingereichte Instanz. Erst wenn man den Parameter mit ByRef schmückt, funktioniert das Ganze wie erwünscht. Den gleichen Denkfehler hatte ich bei einer Dispose-Extension.

    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.

    SKeks schrieb:

    List(of ) ist doch ein Referenztyp und wird damit immer ByRef übergeben?

    @petaod Das ist so nicht korrekt.
    ByRef heißt, dass eine in der Prozedur mit New erstellte neue Liste zurückkommt.
    ByVal gestattet nur das Editieren einer vorhandenen Listen-Instanz.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Test1(ByVal Groups As List(Of String))
    2. Groups = New List(Of String)
    3. End Sub
    4. Sub Test2(ByVal Groups As List(Of String))
    5. Groups = New List(Of String)
    6. End Sub
    7. Sub TestAll()
    8. Dim Groups = New List(Of String)
    9. Groups.Add("42")
    10. Test1(Groups)
    11. Label1.Text = Groups.Count.ToString()
    12. ' Ausgangszustand
    13. Groups = New List(Of String)
    14. Groups.Add("42")
    15. Test2(Groups)
    16. Label2.Text = Groups.Count.ToString()
    17. End Sub

    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!
    ...was auch mein und meinen Spoiler umschreibt.
    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.