2016-11-16 7 views
-1

Ich möchte eine Logik zum Vergleichen von zwei Liste in einer einzigen Iteration mit C# (Unsortierte Liste) implementieren.Vergleichen Sie zwei Liste der Zeichenfolge in einer einzelnen Iteration mit C# - Unsortierte Liste

Beispiel:

List<string> listA = new List<string>() {"IOS", "Android", "Windows"}; 
List<string> listB = new List<string>() {"LINUS", "IOS"}; 

jetzt brauche ich ListeB mit listA, zu vergleichen und ich brauche die fehlenden Elemente in listB wie "Android", "Windows" zu verfolgen, ohne C# vordefinierte Methoden.

Hinweis: Iterieren Sie jede Liste nur einmal.

Bitte helfen Sie mir.

+0

Was haben Sie versucht? –

+0

Ich brauche eine Logik für 'listA.Except (listB)' in optimaler Weise. –

+0

Verstehe den Downvote nicht. Das ist eine absolut gültige Frage. –

Antwort

1

Dies ist wahrscheinlich eine der am besten optimierten Antworten, die Sie wahrscheinlich finden:

public static List<T> Except<T>(List<T> a, List<T> b) 
{ 
    var hash = new HashSet<T>(b); 
    var results = new List<T>(a.Count); 

    foreach (var item in a) 
    { 
     if (!hash.Contains(item)) 
     { 
      results.Add(item); 
     } 
    } 

    return results; 
} 

Anstatt die X x Y Iterationen Sie aus dem Vergleich Listen direkt erhalten, erhalten Sie X + Y-Y aus Iterieren die Vergleichsliste (wenn sie auf eine Hash-Tabelle konvertieren) und X über der Quellenliste iterieren (keine zusätzliche Y da Hash-Tabellen-Lookups konstante Zeit sind).

+0

Danke für den Versuch. In Ihrer Implementierung ruft 'hash.Contains (item)' => '.Contains()' innerhalb der 'foreach' implizit die' foreach' auf, um zu vergleichen (dh ** nested foreach **) –

+2

@IRPunch Nein, tut es nicht ' t. 'hash' ist eine Hash-Tabelle, keine iterierte Liste, also wird' hash.Contains' nicht iteriert - es ist eine Nachschlagefunktion, die in konstanter Zeit abläuft. – Abion47

+0

@IRPunch Siehe das Dokument auf [HashSet.Contains] (https://msdn.microsoft.com/en-us/library/bb356440%28v=vs.110%29.aspx). – Abion47

1

versuchen diese

var objectList3 = listA.Where(o => !listB.Contains(o)).ToList(); 
+0

Ich brauche eine Lösung ohne vordefinierte Methode. und Ihre Antwort verwendet 'X x Y'Iterationen (d. h.' foreach() {foreach() {}} ') –

+1

@IRPunch Es wird nicht billiger als das mit Listen. – Abion47

+0

@ Abion47 - vielleicht, aber ich möchte die manuelle Implementierung, abgesehen von den vordefinierten Erweiterungsmethoden kennen. –

0

Ich weiß nicht, ob ich es völlig richtig bekam (bitte mich, wenn nicht korrekt), aber dies könnte hilfreich sein:

//Remove all elements of b from a 
foreach (string item in b)  
{ 
    a.Remove(item); 
} 

// check for all elements of a if they exist in b and store them in c if not 
public static List<string> Excepts(List<string> a, List<string> b) 
{ 
    List<string> c = new List<string>(); 
    foreach (string s1 in a) 
    { 
     bool found = false; 
     foreach (string s2 in b) 
     { 
      if (s1 == s2) 
      { 
       found = true; 
       break; 
      } 
     } 
     if (!found) 
      c.Add(s1); 
    } 
    return c; 
} 
+0

Danke für Ihren Versuch. Aber in der ersten Implementierung 'Remove()' innerhalb 'foreach()' => 'foreach() {foreach() {}}' –

+0

In der zweiten Implementierung verwenden Sie explizit 'foreach() {foreach() {} } '(dh, X x Y Iteration) –

+0

Aber Sie haben gesagt, wir können jede Liste einmal durchlaufen ?! Das ist, was ich getan habe ... – Jules

Verwandte Themen