Doppelte Einträge aus String Liste entfernen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Doppelte Einträge aus String Liste entfernen

    Hallo leute,

    kann mir jemand erklären, wie ich fast doppelte Einträge entferne?

    Meine Stringlist hat folgende Einträge:

    User1;18.01.2013 10:46:21;Value1
    User1;18.01.2013 10:46:21;Value2

    User1;18.01.2013 10:55:21;Value1

    User1;18.01.2013 10:55:21;Value3


    Dabei sollen nur die ersten zwei Werte (UserID,Timestamp) als Redundanzkriterium geltend sein.

    Kann mir jemand da unter die Arme greifen?
    Sortiere die Liste: myList.Sort() und gehe die Liste mit For, nicht aber For Each, rückwärts durch und vergleiche jeden Eintrag mit seinem Nachbarn.
    Sind sie gleich, wird einer von beiden entfernt.
    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!
    Die Einträge sind schon sortiert, nach Datum, aber ich tu mich irgendwie schwer mit den Bedingungen für das prüfen der nachbareinträge und der Substrings.

    Habe bis jetzt folgendes:

    For index As Int64 = 0 To myList.Count-1

    myListTmp.Add(myList.Item(index))

    Next


    kannst du mir paar weitere tipps geben? Bitte

    VBNooby schrieb:

    paar weitere tipps
    Probier mal dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim xx() As String = {"kljh", "üpio", "hg", "lkj", "üoju", "üpio", "hg"}
    3. Dim ll = New List(Of String)
    4. ll.AddRange(xx)
    5. ll.Sort()
    6. For i = ll.Count - 1 To 1 Step -1
    7. If ll(i) = ll(i - 1) Then
    8. ll.RemoveAt(i)
    9. End If
    10. Next
    11. 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!
    @petaod: welche Bibliotheken benötige ich denn dafür? Finde die Funktion irgendwie nicht von myList.

    lg


    @RodfromGermany: ich habe es gerade ausprobiert, aber in der folgenden Form, weil ich möchte, dass nur die ersten 5 Zeichen nach verfügbarkeit geprüft werden.:

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim xx() As String = {"kljh", "üpio", "hg", "lkj", "üoju", "üpio", "hg"}
    Dim ll = New List(Of String)
    ll.AddRange(xx)
    ll.Sort()
    For i = ll.Count - 1 To 1 Step -1
    If ll(i).Substring(0,2) = ll(i - 1).Substring(0,2) Then
    ll.RemoveAt(i)
    End If
    Next
    End Sub




    Kriege leider die selbe Liste zurück. Why?

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

    VBNooby schrieb:

    Kriege leider die selbe Liste zurück. Why?
    Was ist an diesem Ergebnis falsch?
    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!

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

    LINQ FTW:

    VB.NET-Quellcode

    1. Dim s() As String = {"User1;18.01.2013 10:46:21;Value1",
    2. "User1;18.01.2013 10:46:21;Value2",
    3. "User1;18.01.2013 10:55:21;Value1",
    4. "User1;18.01.2013 10:55:21;Value3"}
    5. Dim unique = From item In (From line In s
    6. Let parts = line.Split(";"c)
    7. Select New With {.ID = parts(0), .Time = parts(1), .Value = parts(2)})
    8. Group item By item.ID, item.Time Into g = Group
    9. Let f = g.First()
    10. Select String.Format("{0};{1};{2}", f.ID, f.Time, f.Value)

    Als Vorbereitung werden die Strings geteilt und in einen anonymen Typ gepackt, um ihr Gruppieren zu ermöglichen. Der Trick ist nun, nach ID und Time zu gruppieren. Dadurch werden alle Einträge, bei denen diese beiden Angaben gleich sind, in dieselbe Gruppe gepackt. Davon wird einfach der erste Eintrag genommen und der identische Rest weggeworfen. Die Nachbereitung bastelt wieder Strings zusammen. Das kann man weglassen, falls die einzelnen Elemente der Strings noch gebraucht werden.
    Gruß
    hal2000
    jo, auf ähnliches binnich auch gekommen, aber ich hab noch das Key-Schlüsselwort verwendet, weil Distinct dann nur den Key anguckt:

    VB.NET-Quellcode

    1. Dim entries = {"User1;18.01.2013 10:46:21;Value1", "User1;18.01.2013 10:46:21;Value2", "User1;18.01.2013 10:55:21;Value1", "User1;18.01.2013 10:55:21;Value3"}
    2. Dim distincted = (From d In (From e In entries Select New With {Key .rCrit = e.Substring(0, 26), e} Distinct) Select d.e).ToArray
    (.rCrit bezeichnet das "RedundanzKriterium")
    Mein Lösungsvorschlag:

    VB.NET-Quellcode

    1. Public Class TestComparer : Implements IEqualityComparer(Of String)
    2. Public Function Equals1(x As String, y As String) As Boolean Implements IEqualityComparer(Of String).Equals
    3. Return x.Substring(0, x.LastIndexOf(";"c)).Equals(y.Substring(0, y.LastIndexOf(";"c)))
    4. End Function
    5. Public Function GetHashCode1(obj As String) As Integer Implements IEqualityComparer(Of String).GetHashCode
    6. Return obj.Substring(0, obj.LastIndexOf(";"c)).GetHashCode()
    7. End Function
    8. End Class
    9. ublic Class Form1
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Dim input As New List(Of String)
    12. Dim result As IEnumerable(Of String) = Nothing
    13. input.Add("User1;18.01.2013 10:46:21;Value1")
    14. input.Add("User1;18.01.2013 10:46:21;Value2")
    15. input.Add("User1;18.01.2013 10:55:21;Value1")
    16. input.Add("User1;18.01.2013 10:55:21;Value3")
    17. result = input.Distinct(New TestComparer())
    18. End Sub
    19. End Class


    Die Distinct-Extension übernimmt ja in einer Überladung einen "IEqualityComparer". Warum nicht das nutzen?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o