Sequenz/Array .Contains() mit Typen, nicht Werten.

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Sequenz/Array .Contains() mit Typen, nicht Werten.

    Hallo

    Mein Problem ist folgendes:
    Ich möchte (ohne Schleife) herausfinden, ob sich eine gewisser Typ in einer List befindet. Mit Instanzen dieses Types funktioniert das schon, aber es geht um den Typ selbst.
    Hier ein Beispiel:

    VB.NET-Quellcode

    1. Class BaseClass
    2. End Class
    3. Class SubClass1
    4. Inherits BaseClass
    5. Public Value As Integer
    6. Public Sub New(ByVal NewValue As Integer)
    7. Value = NewValue
    8. End Sub
    9. End Class
    10. Class SubClass2
    11. Inherits BaseClass
    12. 'Das selbe wie bei SubClass1
    13. End Class
    14. Dim AllEntries As New List(Of BaseClass)
    15. Private Sub Initialize() Handles MyBase.Load
    16. AllEntries.Add(New SubClass1(4))
    17. AllEntries.Add(New SubClass2)
    18. End Sub
    19. Private Sub Test()
    20. If AllEntries.Contains(New SubClass1(4)) Then
    21. End If
    22. End Sub

    Bei der Sub Test überprüft AllEntries.Contains(New SubClass1(4)) nur, ob sich in AllEntries eine Instanz der Klasse SubClass1 mit der Variable Value auf 4 befindet.
    Mein Ziel ist es ohne Schleife herauszufinden, ob sich überhaupt eine Instanz der Klasse SubClass1 in AllEntries befindet.
    Mit der Schleife würde es so funktionieren:

    VB.NET-Quellcode

    1. For Each i As BaseClass In AllEntries
    2. If TypeOf i Is SubClass1 Then
    3. 'Enthält
    4. Exit For
    5. End If
    6. Next

    Aber das sieht aufgrund der Tatsache, dass die exakt selbe Schleife (nur ohne Exit For) direkt danach nochmal durchläuft etwas komisch aus.

    Um jetzt einige Fragen zum Zweck zu beantworten:
    In eine Datei werden nacheinander die nötigen Werte aller Instanzen der Klassen SubClass1 und SubClass2 (in Wirklichkeit andere Namen) geschrieben.
    Diese werden nach Typ geordnet (also SubClass1: und es folgen alle Instanzen der Klasse SubClass1).
    Das sieht so aus:

    VB.NET-Quellcode

    1. Using Writer As New IO.StreamWriter(...)
    2. '...
    3. Writer.WriteLine("SubClass1:") 'Dies soll vermieden werden, wenn keine Instanz von SubClass1 vorhanden ist
    4. For Each i As BaseClass In AllEntries
    5. If TypeOf i Is SubClass1 Then
    6. With DirectCast(i, SubClass1)
    7. Writer.WriteLine(.Value.ToString & ";" & ...) 'In Wirklichkeit folgen da noch einige andere Werte
    8. End With
    9. End If
    10. Next
    11. 'Das Selbe mit SubClass2

    Wie im Kommentar erwähnt soll "SubClass1:" nur in die Datei geschrieben werden, wenn auch Instanzen von SubClass1 vorhanden sind.
    Wenn das nicht vorher überprüft wird geht auch nicht die Welt unter. Es sieht halt schöner aus, wenn in der Datei unnötige Einträge weggelassen werden.

    Ich hoffe ich konnte das Problem verständlich erklären.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Nun, das wusste ich.
    Kurzfassung: Wie kann ich herausfinden, ob ein Array einer übergeordneten Klasse eine Instanz einer untergeordneten Klasse enthält.
    Wie bereits geschrieben: ohne Schleife.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Wie bereits geschrieben: ohne Schleife.

    Gar nicht. Auch "Contains" etc arbeiten mit einer Schleife.

    Was geht:

    VB.NET-Quellcode

    1. Dim a() As Object = {1.7, "A", 2.5, 7}
    2. Dim EnthaeltInteger As Boolean = (From p In a Where TypeOf p Is Integer Select 1 Take 1).Count > 0

    Aber das läuft natürlich als Schleife, was du ja nicht willst ...
    Das sieht schon mal nicht schlecht aus.
    Ich hoffe das funktioniert auch bei mir...
    Moment...

    Ja! Hammermäßig! Danke picoflop. Genau sowas habe ich gesucht.

    Es läuft zwar intern mit einer Schleife ab (was anderers hätte ich auch nicht erwartet), aber nicht hier im Code.

    Danke
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils