2017-03-15 2 views
-2

Wissen, dass die nicht-generic ICollection keine Contains Methode bieten, was ist der beste Weg, um zu überprüfen, ob ein bestimmtes Objekt bereits in einer Sammlung?ICollection - überprüfen, ob eine Sammlung ein Objekt enthält

Wenn ich zwei hatte ICollections: A und B und wollte überprüfen, ob B alle Elemente von A hat, was wäre der beste Weg, um das zu erreichen? Mein erster Gedanke ist, alle Elemente von A zu einem HashSet hinzuzufügen und dann zu prüfen, ob alle Elemente von B mit Contains im Set sind.

+2

Cast-> ToList-> Enthält – Nkosi

+0

@Nkosi sollten Sie es wahrscheinlich in eine Antwort setzen, damit er diese Frage schließen kann :) – CNuts

+0

'Mein erster Gedanke ist, alle Elemente von A zu einem HashSet hinzuzufügen und dann zu prüfen, ob alle B-Elemente sind im Set mit Contains. Was ist also passiert, als du das versucht hast? – Servy

Antwort

-2
Boolean ICollectionContains(ICollection collection, Object item) 
{ 
    for (Object o in collection) 
    { 
     if (o == item) 
     return true; 
    } 
    return false; 
} 

Oder in Verlängerung Form:

public static class CollectionExtensions 
{ 
    public static Boolean Contains(this ICollection collection, Object item) 
    { 
     for (Object o in collection) 
     { 
     if (o == item) 
      return true; 
     } 
     return false; 
    } 
} 

Mit Nutzung:

ICollection turboEncabulators = GetSomeTrunnions(); 

if (turboEncabulators.Contains(me)) 
    Environment.FailFast(); //How did you find me! 
+0

Dies verwendet nur Referenzgleichheit und Sie können auch einfach 'collection.Cast () .Any (o => o == Element)' verwenden, wenn Sie das tun möchten. – Lee

0

A und B und wollte überprüfen, ob B alle Elemente von A

hat

Ich denke du hast es rückwärts. Füge das B zum HashSet hinzu.

HashSet.Contains ist O (1)
Insgesamt wird es O (n + m)

gehen Zeichenfolge zu übernehmen

HashSet<string> HashSetB = new HashSet<string>(iCollecionB); 
    foreach (string s in iCollecionA) 
    { 
     if(HashSetB.Contains(s)) 
     { 
     } 
     else 
     { 
     } 
    } 
3

Wenn ich zwei hatte ICollectionsA und B und wollte überprüfen, ob B alle Elemente von A hat, was wäre der beste Weg, um das zu erreichen?

Lassen Sie mich Ihre Frage in den Sprachen der Sätze umformulieren.

Wenn ich zwei Sätze hatte A und B und wollte prüfen, ob A eine Teilmenge von B ist, was wäre der beste Weg, das zu erreichen?

Jetzt wird es einfach, die Antwort zu sehen:

https://msdn.microsoft.com/en-us/library/bb358446%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Konstruieren Sie einen HashSet<T> von A und verwenden Sie dann die IsSubsetOf Methode, um zu sehen, ob A eine Teilmenge von B ist.

Ich beachte, dass, wenn dies die Arten von Operationen sind, die Sie häufig durchführen müssen, sollten Sie Ihre Daten in HashSet<T> Sammlungen zu Beginn behalten. Die Operation IsSubsetOf ist möglicherweise effizienter, wenn beide Sammlungen Hash-Sätze sind.

+2

Der Hauptgrund, warum Sie einen Leistungszuwachs erzielen, wenn beide Sets "HashSet" -Sammlungen sind, ist, dass 'Contains'-Abfragen in konstanter Zeit ausgeführt werden. Sie können diese Leistung erzielen, ohne '' HashSet'' aus 'A' zu konstruieren, wenn Sie' B.IsSupersetOf (A) 'anstelle von' A.IsSubsetOf (B) 'aufrufen. – Brian

+0

@Brian: Guter Tipp! –

Verwandte Themen