Verzweifele beim Vergleichen zweier Arrays.

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Killerjo96.

    Verzweifele beim Vergleichen zweier Arrays.

    Hallöschen und Juten Abend,

    Ich bin jetz schon seid heute Morgen dran, einen Patcher für mein Spiel zu programmieren. Das ganze soll wie folgt aussehen:
    Beim Start des Patchers liest der Patcher die list.txt ein, welche so aufgebaut ist:

    Quellcode

    1. data01.package|MD5HASH|
    2. data02.package|MD5HASH|
    3. data03.package|MD5HAHS|
    4. data04.package|MD5HASH|
    5. usw.

    Diese lese ich dann mit einer For Each Schleife wie folgt aus:

    VB.NET-Quellcode

    1. For Each oldListLine In File.ReadAllLines("list.txt")
    2. 'TU WAS
    3. Next


    Soweit so gut, jetzt gibbet aber noch ne zweite Liste (die aktuelle in dem Fall). Diese wird heruntergeladen und als NewList.txt abgespeichert. Der Inhalt unterscheidet sich dann eben darin, das z.B. Dateien verändert wurden, also auch der MD5 Wert anders ist. Diese Datei wird also auch in einer For Each Schleife eingelesen. Und ab hier weiß ich nicht weiter wie ich die beiden Listen jetz vergleichen kann... Ich habe probiert die NewList.txt For Each schleife in der For Each Schleife von der list.txt zu machen und dann einfach splitten:

    VB.NET-Quellcode

    1. Dim Data_SetOld As String() = OldListLine.Split("|")
    2. Dim Data_SetNew As String() = NewListLine.Split("|")
    3. If Data_SetOld(0) = Data_SetNew(0) Then 'Es wäre dieselbe Zeile.
    4. If Data_SetOld(1) <> Data_SetNew(1) Then 'Der Hash wäre anders. Also diese Datei patchen.
    5. DownloadFile(Data_SetNew(0) 'Ne Funktion die dann die Datei herunterlädt.
    6. End If
    7. End If


    Aber irgendwie will das alles nicht, und wenn ich so drüber nachdenke kann es so auch nich funktionieren, weil wenn z.B. eine Zeile in den Listen dazukommt würde er schon Fehler oder sonst was ausspucken.

    Ich hoffe ihr habt so nen kleinen Überblick was ich überhaupt will. Ich möchte die beiden Listen vergleichen, und wenn eine Zeile Neu ist dann soll diese Datei dann auch runtergeladen werden, und wenn die Zeile verändert (hash wert anders) wurde, möchte ich die datei auch runterladen und ersetzen... Die Funktionen zum runterladen hab ich mir schon programmiert und können mit nur einer zeile abgerufen werden.
    Aber ich hänge jetz schon den ganzen Tag davor, und schaffe es einfach nicht die Listen zu vergleichen/auszuwerten.

    Hoffe ihr könnt mir helfen.

    8o
    Was genau willst Du denn eigentlich miteinander vergleichen?
    Ggf. musst Du 2 Schleifen ineinander machen, um jedes Element des einen Arrays mit jedem Element des anden Arrays zu vergleichen:

    VB.NET-Quellcode

    1. For Each elem1 In Data_SetOld
    2. For Each elem2 In Data_SetNew
    3. If elem1 = elem2 Then
    4. ' was tun
    5. Else
    6. ' was anderes tun
    7. End If
    8. Next
    9. Next
    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!
    Ok, danke schonmal für die Antworten, ich werde es mal mit dem Dictionary ausprobieren.

    Edit: Ich habe es jetzt so gemacht, aber es ergibt für mich irgendwie keinen Sinn, wenn ich so Zeile für Zeile vergleichen würde und eine Zeile dann nicht da ist, sind die restlichen ja auch nicht da, obwohl sie es könnten.

    VB.NET-Quellcode

    1. For Each OldData_Set In File.ReadAllLines("list.txt")
    2. Dim DataSplit() As String = OldData_Set.Split("|")
    3. OldPatchList.Add(DataSplit(0), DataSplit(1))
    4. Next
    5. For Each NewData_Set In File.ReadAllLines("NewList.txt")
    6. Dim DataSplit() As String = NewData_Set.Split("|")
    7. If OldPatchList(DataSplit(0)) = NewData_Set(DataSplit(0)) Then
    8. 'HIER würd es keinen sinn ergeben... warum, steht weiter unten.
    9. End If
    10. Next


    Warum? Weil wenn z.B. ne neue zeile eingeschoben wurde (neue datei) dann würde ja nur noch else gehn und in das else, würde dann eig. ja der download der neuen datei stattfinden aber das muss ja eventuell garnich sein.. wenn einfach nur ne zeile eingeschoben wurde dann würden alle nachfolgenden dateien neu gepatched werden.

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

    Nun, wenigstens hast Du Dich mit dem Dictionary angefreundet, was bei Key/Value Pairs eigentlich immer Sinn macht (bzw. HashTable).

    Wie wärs hiermit (ungetestet):

    VB.NET-Quellcode

    1. Dim dictNew = GetPackages("newList.txt")
    2. Dim dictOld = GetPackages("oldList.txt")
    3. For Each package In dictNew.Keys
    4. If dictOld.ContainsKey(package) AndAlso dictOld(package) = dictNew(package) Then Continue For
    5. ' patch package here
    6. ......
    7. Next
    8. Private Function GetPackages(ByVal filename As String) As Dictionary(Of String, String)
    9. Dim dict As New Dictionary(Of String, String)
    10. For Each line As String In File.ReadAllLines(filename)
    11. Dim splitted() As String = line.Split("|"c)
    12. Dim package As String = splitted(0).Trim.ToUpper : Dim hash As String = splitted(1).Trim.ToUpper
    13. dict.Add(package, hash)
    14. Next
    15. Return dict
    16. End Function

    Falls die alte Liste auch andere/mehr Namen als die neue Liste enthalten kann, so wirst Du das auch umgekehrt machen müssen.
    Okay, im Prinzip klappt des jetz glaub ich, aber ich hab das Prinzip von Dictionary noch nicht verstanden...

    Kangaroo schrieb:

    For Each package In dictNew.Keys If dictOld.ContainsKey(package) AndAlso dictOld(package) = dictNew(package) Then Continue For ' patch package here ...... Next


    Wie z.B. krieg ich jetz den Packagenamen?

    Edit: Ah ich glaube das ist einfach nur package oder?

    Edit²: Also ich denke es klappt jetzt, wenn nicht melde ich mich hier nochmal.

    Vielen Dank, und ich werde mir jetzt erstmal Dictionary genau anschauen, damit ich´s auch verstehe. :D

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

    Ansonsten mach mal ein Beispiel mit 2 Arrays, die 3 oder 4 Elemente haben.
    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!
    Du könntest erst mal den Hash beider Dateien berechnen und vergleichen. Somit weißt du gleich mal, ob überhaupt eine Änderung vorliegt.

    VB.NET-Quellcode

    1. Public Function FileEquals(Byval OldPath as String, ByVal NewPath as String) as Boolean
    2. Using SHA As System.Security.Cryptography.SHA512 = System.Security.Cryptography.SHA512Managed.Create()
    3. SHA.Initialize()
    4. If Convert.ToBase64String(SHA.ComputeHash(New IO.FileStream(oldpath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None))) = Convert.ToBase64String(SHA.ComputeHash(New IO.FileStream(newpath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None))) Then
    5. Return True
    6. Else
    7. Return False
    8. End If
    9. End Using
    10. End Function
    11. Public Sub Main()
    12. Dim oldpath As String = IO.Path.Combine(Application.StartupPath(), "oldList.txt")
    13. Dim newpath As String = IO.Path.Combine(Application.StartupPath(), "newList.txt")
    14. If FileEquals(OldPath,NewPath) then
    15. MsgBox("Beide Dateien sind gleich!")
    16. Else
    17. 'Hier wird dann der Patcher gestartet
    18. End If
    19. End Sub


    Edit: Zur Methode von @Kangaroo:

    Ich würde bei einem patcher immer die die neue Liste als Referenz hernehmen, da auch neue Dateien hinzukommen können, die danach gepatcht werden müssen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim dictNew = GetPackages("newList.txt")
    2. Dim dictOld = GetPackages("oldList.txt")
    3. For Each package As String In dictNew.Keys
    4. If dictNew.ContainsKey(package) Then
    5. If Not dictOld.ContainsKey(package) Then
    6. 'Datei patchen bzw. zum patchen vormerken
    7. ElseIf dictNew(package) <> dictOld(package) Then
    8. 'Datei patchen bzw. zum patchen vormerken
    9. End If
    10. End If
    11. Next
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

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

    Man könnte sich auch ne Klasse machen, die entsprechende Infos enthält.

    Dateiname
    Dateiversion
    Was Soll mit der Datei gemacht werden
    Wohin muss die Datei kopiert werden
    usw.

    Also z.B.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class PatchFile
    3. Public Enum FileAction
    4. [Nothing] = 0
    5. Download = 1
    6. Copy = 2
    7. Run = 4
    8. Register = 8
    9. Delete = 16
    10. End Enum
    11. Public Property Version As New Version
    12. Public Property Action As New FileAction
    13. Public Property DestPath As String
    14. Public Property RunWith As String
    15. Public Property DownloadURL As String
    16. End Class
    17. <Serializable()>
    18. Public Class Patcher
    19. Public Files As Dictionary(Of String, PatchFile)
    20. Public Sub New()
    21. MyBase.New()
    22. Files = New Dictionary(Of String, PatchFile)
    23. End Sub
    24. Public Sub New(ByVal FileName As String)
    25. MyBase.New()
    26. Try
    27. Using fs As New IO.FileStream(FileName, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
    28. Dim bin As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    29. Files = DirectCast(bin.Deserialize(fs), Dictionary(Of String, PatchFile))
    30. End Using
    31. Catch ex As Exception
    32. Files = New Dictionary(Of String, PatchFile)
    33. End Try
    34. End Sub
    35. Sub TryLoad(ByVal FileName As String)
    36. Try
    37. Using fs As New IO.FileStream(FileName, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
    38. Dim bin As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    39. Files = DirectCast(bin.Deserialize(fs), Dictionary(Of String, PatchFile))
    40. End Using
    41. Catch ex As Exception
    42. Files = New Dictionary(Of String, PatchFile)
    43. End Try
    44. End Sub
    45. Sub Save(ByVal FileName As String)
    46. Using fs As New IO.FileStream(FileName, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.None)
    47. Dim bin As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
    48. bin.Serialize(fs, Files)
    49. End Using
    50. End Sub
    51. End Class
    52. Sub Main()
    53. Dim p As New Patcher()
    54. p.Files.Add("TestFile", New PatchFile With {.Action = PatchFile.FileAction.Download Or PatchFile.FileAction.Copy,
    55. .DestPath = "%StartUp%\Test",
    56. .Version = New Version(1, 0, 0, 1)})
    57. p.Files.Add("TestFile2", New PatchFile With {.Action = PatchFile.FileAction.Download Or PatchFile.FileAction.Copy Or PatchFile.FileAction.Run,
    58. .DestPath = "%StartUp%\Test",
    59. .RunWith = "",
    60. .Version = New Version(1, 0, 0, 1)})
    61. p.Save(IO.Path.Combine(Application.StartupPath(), "update.blst"))
    62. p = Nothing
    63. Dim p2 As New Patcher(IO.Path.Combine(Application.StartupPath(), "update.blst"))
    64. For Each kv As KeyValuePair(Of String, PatchFile) In p2.Files
    65. Dim FileDest As String = IO.Path.Combine(kv.Value.DestPath.Replace("%StartUp%", Application.StartupPath), kv.Key)
    66. If kv.Value.Action.HasFlag(PatchFile.FileAction.Delete) Then
    67. 'Delete
    68. If IO.File.Exists(FileDest) Then
    69. IO.File.Delete(FileDest)
    70. End If
    71. End If
    72. If kv.Value.Action.HasFlag(PatchFile.FileAction.Download) Then
    73. 'Download
    74. Using wc As New System.Net.WebClient()
    75. wc.DownloadFile(kv.Value.DownloadURL, IO.Path.Combine(Application.StartupPath, kv.Key))
    76. End Using
    77. End If
    78. If kv.Value.Action.HasFlag(PatchFile.FileAction.Copy) Then
    79. 'Copy
    80. IO.File.Copy(IO.Path.Combine(Application.StartupPath, kv.Key), FileDest, True)
    81. End If
    82. If kv.Value.Action.HasFlag(PatchFile.FileAction.Run) Then
    83. 'Run
    84. If String.IsNullOrWhiteSpace(kv.Value.RunWith) Then
    85. If kv.Value.Action.HasFlag(PatchFile.FileAction.Copy) Then Process.Start(FileDest) Else Process.Start(IO.Path.Combine(Application.StartupPath, kv.Key))
    86. Else
    87. Dim proc As New Process
    88. proc.StartInfo.FileName = kv.Value.RunWith
    89. If kv.Value.Action.HasFlag(PatchFile.FileAction.Copy) Then
    90. proc.StartInfo.Arguments = FileDest
    91. Else
    92. proc.StartInfo.Arguments = IO.Path.Combine(Application.StartupPath, kv.Key)
    93. End If
    94. proc.Start()
    95. proc.WaitForExit()
    96. End If
    97. End If
    98. If kv.Value.Action.HasFlag(PatchFile.FileAction.Register) Then
    99. 'Register
    100. End If
    101. Next
    102. End Sub


    Hier wird einfach ein Dictionary, mit den zu patchenden Dateien erstellt und als Binär-Datei auf die Platte geschrieben. Das ist die Datei, welche auf dem Server liegt.
    Danach wird diese "Liste" eingelesen und nach bestimmten Regeln abgearbeitet. (Löschen -> Downloaden -> Kopieren -> Ausführen -> Registrieren (DLL's))
    Momentan ist aber noch keine Überprüfung dabei, ob überhaupt gepatcht werden soll oder nicht.

    Alternativ, könnte man das Patchen doch auch über einen Web-Service machen. Der Client sendet alle Datei-Informationen an den Server (Name und Version), entspricht eine Version nicht dem aktuellsten Stand, wird die aktuellste Datei zum Client gesendet, welcher die alte mit der neuen Datei ersetzt.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    logik-mäßig kommts immer aufs gleiche raus:
    aus der neuen Version müssen die 3 Anteile eruiert werden: Deleteds, Addeds, Modifieds

    Es erinnert bischen an Datenbank-Logik, etwa die Datarow.RowState-Enumeration weist diese Werte auf.
    Oder auch direkt Sql, da gibts ja u.a. die Grund-Kommandos: Delete, Insert, Update

    Zu verwalten ist glaub am einfachsten, man muß nur die neue Version mit allen Dateien einstellen, und der Patcher implementiert halt die Intelligenz, die Deleteds, Addeds, Modifieds zu unterscheiden.

    Klar kann man diese Information auch im Voraus eruieren, und dann direkt verfügbar machen - das könnte sogar bischen Platte-Platz sparen.
    Aber wenn die Intelligenz im Patcher ist, ists glaub robuster. ZB kann u.U. auch eine Zwischen-Version übersprungen werden.

    Ausserdem können aber so oder so noch immer fiese weitere Probs auftreten, insbesondere, wenn Versionen übersprungen werden sollen - kommt halt aufs zu patchende System an.
    Man kann bei der System.Version() 4 Nummern angeben:
    Build, Major, Minor, Revision

    Anhand dieser kann man ja Regeln definieren. Änderungen in Minor und Revision können übersprungen werden, Major und Build müssen zwingend gemacht werden.

    Die Methode über den Webservice finde ich deswegen nicht schlecht, weil der Client nicht überprüfen muss was er alles Patchen muss. Der Client sendet nur die Daten aller möglichen Dateien (vl vordefiniert aus einer Liste) und der Server gibt entsprechend die Updates aus.

    Wenn die Dateien, welche man Updaten muss, nicht zu groß sind, kann man diese Serverseitig auch in einer DB speichern. Als kompletten Datensatz mit Version, Name usw...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Edit: Zur Methode von @Kangaroo
    Ich würde bei einem patcher immer die die neue Liste als Referenz hernehmen, da auch neue Dateien hinzukommen können, die danach gepatcht werden müssen.

    Vielleicht solltest Du den Code erst einmal verstehen, bevor postest: die neue Liste ist die Referenz, schliesslich werden die Keys der neuen Liste durchlaufen.

    Ansonsten ist Deine verschlimmbesserte Version ziemlicher Murks:
    - Zeile 4 ist vollkommen überflüssig, da immer TRUE
    - Zeile 5 und 7 lassen sich wie bei mir mit AndAlso zusammenfassen, so dass der Patchcode nur an 1 Stelle erfolgt

    Zu Deiner Idee mit dem Dateihashcode: möglich aber relativ unnötig , da es ausser bei zigtausend Einträgen keinerlei merkbare Performance-Vorteile besitzt und damit den Code nur verkompliziert.
    Ausserdem werden Streams bitte sauber geschlossen.

    Kangaroo schrieb:

    Ansonsten ist Deine verschlimmbesserte Version ziemlicher Murks:

    Zu dem mit Zeile 4 muss ich dir zustimmen, dass bringt hier nicht viel, aber 5 und 7 sollten nicht zusammengefasst werden, da eine TXT-Datei nicht ausgeführt werden soll.

    Kangaroo schrieb:

    damit den Code nur verkompliziert.

    Wenn du die 10 Zeilen Code, die sowieso schon als Funktion zusammengefasst wurden, zu kompliziert findest, dann kannst du diese auch weglassen, allerdings finde ich es unnötig, jeden einzelnen Eintrag zu prüfen, wenn ich genauso über einen Hash sagen kann dass sich nichts verändert hat.

    Kangaroo schrieb:

    Ausserdem werden Streams bitte sauber geschlossen.

    msdn.microsoft.com/de-de/library/vstudio/htd05whh.aspx

    "End Using" gibt die verwendete Resource mit "Dispose" wieder frei. Somit ist der Stream sauber geschlossen.

    Kangaroo schrieb:

    Vielleicht solltest Du den Code erst einmal verstehen, bevor postest: die neue Liste ist die Referenz, schliesslich werden die Keys der neuen Liste durchlaufen.

    Vl solltest du nicht sofort davon ausgehen, das jemand etwas nicht versteht. Ich habe mich schlichtweg verlesen, was mein Verständnis deines Codes nicht mindert, da die Funktionalität gleich bleit und sich nur die Referenzliste ändert.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    aber 5 und 7 sollten nicht zusammengefasst werden, da eine TXT-Datei nicht ausgeführt werden soll.

    Könntest Du das bitte mal erläutern ? Selbst nach mehrmaligem Lesen habe ich es immer noch nicht verstanden

    BiedermannS schrieb:

    allerdings finde ich es unnötig, jeden einzelnen Eintrag zu prüfen, wenn ich genauso über einen Hash sagen kann dass sich nichts verändert hat.

    Möglich ist es, aber wie gesagt wirst Du damit keinen Performancevorteil haben: das Lesen von so kleinen Dateien funktioniert im Bereich von Milli/Mikro-Sekunden. Ausserdem liest Du erst beide Dateien vollständig um den SHA Wert zu ermitteln, um sie dann ggf. zum Patchen nochmals zu lesen.

    BiedermannS schrieb:

    "End Using" gibt die verwendete Resource mit "Dispose" wieder frei. Somit ist der Stream sauber geschlossen.

    Nein. Du gibts die SHA Klasse frei, aber nicht Deine beiden geöffneten File-Streams.
    Kannst Du selber leicht nachprüfen, indem Du Deine Funktion 2x nacheinander ausführst: Du erhältst eine Access-Exception da beim 2.Mal die Files nicht geöffnet werden können, weil sie eben noch nicht freigegeben wurden.

    Das Using Statement gibt die angesprochenen Instanz frei, aber nicht automatisch alles was Du zwischen Using ... End Using anstellst.

    EDIT: ich reagiere immer etwas harsch wenn man meinen Code (unberechtigt) kritisiert, muss wohl eine Art misratener Vaterkomplex sein

    Greifen wir mal Deinen Ansatz auf und schliessen die Streams sauber

    VB.NET-Quellcode

    1. Public Function FileEquals(ByVal OldPath As String, ByVal NewPath As String) As Boolean
    2. Using MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider, _
    3. oldStream As New IO.FileStream(OldPath, IO.FileMode.Open, IO.FileAccess.Read), newStream As New IO.FileStream(NewPath, IO.FileMode.Open, IO.FileAccess.Read)
    4. Return (BitConverter.ToString(MD5.ComputeHash(oldStream)) = BitConverter.ToString(MD5.ComputeHash(newStream)))
    5. End Using
    6. End Function

    Du wirst feststellen, daß die Erzeugung und Vergleich des Hashwertes genauso lange dauert wie der der Code den ich oben gepostet habe (~200ms für 1.000 Iterationen)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kangaroo“ ()

    Kangaroo schrieb:

    Könntest Du das bitte mal erläutern ?

    Der Gedanke dahinter ist, dass es Dateien gibt, die ausgeführt werden müssen, nachdem der Patcher Sie heruntergeladen hat. Für diese ist das Run-Flag gedacht. Dateien welche "nur" in ein Verzeichnis kopiert werden müssen, brauchen nicht ausgeführt werden. z.B.: Text-Dateien oder wenn du Datensätze (z.B.: SQLite) mitlieferst, so müssen diese nur ins Verzeichnis verschoben werden, allerdings nicht ausgeführt.

    Kangaroo schrieb:

    Nein. Du gibts die SHA Klasse frei, aber nicht Deine beiden geöffneten File-Streams.

    Stimmt, das habe ich leider übersehen.

    Kangaroo schrieb:

    ich reagiere immer etwas harsch wenn man meinen Code (unberechtigt) kritisiert

    Mein Ziel war nicht, deinen Code zu kritisieren, sondern diesen zu Verbessern bzw. zu ergänzen. Da ich mich verlesen habe, hat es so ausgesehen als wenn du die alte Liste als Referenz durchläufst, aber wie bereits gesagt, das war nur ein Lesefehler meinerseits.

    Kangaroo schrieb:

    Du wirst feststellen, daß die Erzeugung und Vergleich des Hashwertes genauso lange dauert wie der der Code den ich oben gepostet habe

    Das mag sein, aber mein Ansatz hier war ein anderer. Nämlich dass man nicht extra zwei Listen durchforsten muss, wenn man so auf einen Blick sieht, dass diese gleich sind. Für mich ist das nämlich der logischere Ansatz.

    Und ich habe ja nicht behauptet, es wäre die beste Möglichkeit, die ab jetzt jeder benutzen muss. Das ganze war nur ein Vorschlag, da es für mich logischer ist, zuerst zu prüfen ob etwas zu tun ist, bevor ich die Listen durchlaufe.

    Und dafür ist das Forum ja schließlich da, um Ideen und Wissen auszutauschen, sowie aus Fehlern und dem Wissen anderer zu lernen. (So wie ich gelernt habe, dass ich neu erzeugte Streams, innerhalb eines Using-Blocks explizit schließen muss, da End Using sich nicht, wie bis jetzt angenommen, darum kümmert.)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    dass ich neu erzeugte Streams, innerhalb eines Using-Blocks explizit schließen muss
    Oder Du packst diese ihrerseits in einen Using-Block.
    4 ineinandergeschachtelte Using-Blöcke halte ich für nix Besonderes.
    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!