.NET-Generika - Vergleichen Sie zwei Listen und filter: best practice

Habe ich zwei generische Listen des Typs T. Beide Listen enthalten die gleichen Typ, und ich möchte erstellen Sie eine Dritte Liste (oder eine gefilterte version der Liste 2) auf der Grundlage der Elemente in der Liste zwei, die nicht in Liste 1, basierend auf der ID von jedem item.

Jede Liste enthält ein "Paket" - Objekt, das die ID-Eigenschaft.

Ich jetzt verspottet, bis Sie den code mit For Each-Schleifen, die ich kenne, ist schrecklich (das Große O ist Konstante Zeit) also ich würde gerne eine weitere effiziente Methode.

dieser code in VB pro Projekt requirments, aber ich bevorzuge C# - also entweder code-Beispiel für mich arbeiten würde.

Private Sub RemoveStockPackagesFromSelection()

    Dim p As Package
    Dim packageList As List(Of Package) = New List(Of Package)
    Dim stockPackageList As List(Of Package) = New List(Of Package)
    Dim result As List(Of Package) = New List(Of Package)

    ' Fill list with User's Packages
    For i As Integer = 0 To ListBox2.Items.Count - 1
        p = New Package
        p.Id = CInt(ListBox2.Items(i).Value)
        p.Name = ListBox2.Items(i).Text
        packageList.Add(p)
    Next

    ' Fill list with Stock Packages to compare:
    Dim ds As DataSet = DAL.GetStandardPackages()

    For Each dr As DataRow In ds.Tables(0).Rows
        p = New Package
        p.Id = CInt(dr.Item("id"))
        stockPackageList.Add(p)
    Next

    ' Do Compare and Filter
    For Each p1 As Package In packageList
        For Each p2 As Package In stockPackageList
            If Not p1.Id = p2.Id Then
                result.Add(p2)
            End If
        Next
    Next

    ' Here is our new trimmed list:
    Response.Write(result.Count)

End Sub

Was ist ein schönes und sauberes LINQ oder Lamda Weg, das zu tun diese Art der Filterung? Was ist die Große O von meiner Methode und was wäre der Big O der vorgeschlagenen Methode (nur draussen meine Neugier).

Dank

  • Haben Sie versucht, Ihren code? Es nicht so funktioniert, wie Sie es beschreiben sollte.
  • Shawn, für eine Frage wie diese kann man auch weglassen Abfüllung der Basis-Listen. Wir glauben, Sie haben zwei Listen.
  • Es gibt einige erstaunliche Antworten hier aus in erstaunlich kurzer Zeit. Ich Liebe dieses forum. Ich Baue ein Beispiel für die Verwendung von IEqualityComparer und Zebi ist LINQ-Abfrage, wie das ist, was vor allem ich war auf der Suche, aber ich appricate, die beraten, mit HashSets, Dictionaries und die .Außer () - Erweiterungsmethode. Alle sehr solide und interessante Lösungen. Ich bin versuchen zu verstehen, Big-O (das scheint zu sein, das Heiße Thema des Tages in CSE), also danke für deine Einsicht, Jungs. Super Antworten...
  • Zeit (und Speicher -) Komplexität immer war und wahrscheinlich immer sein wird, ein heißes Thema in CS.
  • Stimmt, Algorithmische Programmierung immer da war und immer sein wird, unabhängig davon, was neue Sprachen entstehen - Big O wird immer ein "heißes Thema". Denke, das war irgendwie eine dumme Sache zu sagen... UndoSelfDepricatingComment() 🙂
InformationsquelleAutor nocarrier | 2011-06-19
Schreibe einen Kommentar