2009-02-01 2 views
84

Was wäre der beste Weg, um in einem string[] zu sehen, ob es ein Element enthält. Das war meine erste Chance darauf. Aber vielleicht gibt es etwas, das ich übersehe. Die Array-Größe ist nicht größer als 200 Elemente.Ist String in Array?

bool isStringInArray(string[] strArray, string key) 
{ 
    for (int i = 0; i <= strArray.Length - 1; i++) 
     if (strArray[i].ToString() == key) 
      return true; 
    return false; 
} 

Antwort

169

Sie werden die bereits eingebaute in contains() Methode:

using System.Linq; 

//... 

string[] array = { "foo", "bar" }; 
if (array.Contains("foo")) { 
    //... 
} 
+0

Aus irgendeinem Grund, als ich zum ersten Mal nach der Methode suchte, konnte ich es nicht finden ... danke. – Brad

+4

@Brad: Das ist, weil es eine Erweiterungsmethode von Enumerable kommt. – AnthonyWJones

+47

Sie müssen System.Linq einbeziehen, damit dies funktioniert. –

1

Sie können auch LINQ über das Array zu durchlaufen. oder Sie können die Find-Methode verwenden, nach der ein Delegat sucht. Ich denke jedoch, dass die Find-Methode ein bisschen teurer ist, als nur durchzublättern.

+0

Die Find-Methode ist algorithmisch identisch mit der" Durchschleif "-Methode. Jeder zusätzliche Aufwand wird durch die Erzeugung von Objekten verursacht und vielleicht durch eine oder zwei Ebenen der Indirektion, aber wenn Sie sich Sorgen darüber machen, diese auf Kosten der Lesbarkeit zu optimieren, sorgen Sie sich um die falschen Dinge. –

6

Ist das Array sortiert? Wenn ja, könnten Sie eine binary search tun. Hier ist the .NET implementation as well. Wenn das Array sortiert ist, verbessert eine binäre Suche die Leistung gegenüber jeder iterativen Lösung.

+0

Nun, O (N) zu O (log n); -p –

+0

Ich entfernte meine hyperbolische "exponentiell" :) –

12

Sie sind einfach nach der Funktion Array.Exists (oder der Methode Enthält, wenn Sie .NET 3.5 verwenden, was etwas bequemer ist).

+3

Hier ist ein funktionierendes Beispiel für .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor)) – Fueled

6

Linq (für s & Gs):

var test = "This is the string I'm looking for"; 
var found = strArray.Any(x=>x == test); 

oder je nach Bedarf

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase)); 
1

Dies ist schneller als von Hand durch das Array iterieren:

static bool isStringInArray(string[] strArray, string key) 
    { 

     if (strArray.Contains(key)) 
      return true; 
     return false; 
    } 
+1

Und das ist schneller wie? – senfo

+0

mithilfe von LINQ ist schneller als das Durchlaufen der Zeichenfolge wie im Beispiel. strArray.Contains (key) ist alles, was wirklich nötig ist –

+2

Hinter den Kulissen wird strArray.Contains (key) einfach durch das Array laufen ... es gibt keine Magie, die dich dazu bringt, ein O (n) zu machen Suche. –

2

Arrays sind Im Allgemeinen eine schlechte Datenstruktur zu verwenden, wenn Sie fragen möchten, ob ein bestimmtes Objekt ist in der Sammlung oder nicht.

Wenn Sie diese Suche häufig ausführen, könnte es sich lohnen, statt eines Arrays ein Dictionary<string, something> zu verwenden. Nachschlagevorgänge in einem Dictionary sind O (1) (Konstante-Zeit), während die Suche durch das Array ist O (N) (dauert Zeit proportional zur Länge des Arrays).

Auch wenn das Array nur 200 Elemente höchstens, wenn Sie viele dieser Suchvorgänge durchführen, wird das Wörterbuch wahrscheinlich schneller sein.

+1

binäre Suche ist O (log n); Dictionary ** subsumiert ** zu O (1) - aber es gibt eine Menge Overhead; Für kleine bis mittlere Formate kann die lineare Suche oder die binäre Suche leistungsfähiger sein. –

1

Wie im Thread oben oft erwähnt, hängt es vom verwendeten Framework ab. . Net Framework 3 und höher hat die. Contains() - oder Exists() -Methoden für Arrays. Für andere Frameworks können unten tun, die folgenden Trick, anstatt durch Anordnung von looping ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here") 

nicht sicher, auf Effizienz ... Dave

20

Ich weiß, das ist alt, aber ich wollte die neue Leser wissen, dass es eine neue Methode gibt, um dies mithilfe von Generika und Erweiterungsmethoden zu tun.

können Sie meine lesen blog post, um mehr Informationen zu sehen, wie dies zu tun, aber die Grundidee ist folgende:

diese Erweiterung Methode, um Ihren Code Durch Zugabe:

public static bool IsIn<T>(this T source, params T[] values) 
{ 
    return values.Contains(source); 
} 

Sie können führen Sie Ihre Suche wie folgt:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4"); 

Es funktioniert auf jeden Typ (solange Sie eine gute equals-Methode erstellen). Jeder Werttyp ist sicher.

+0

Ich habe so etwas 'var xxx = csvData.Rows [0] .ItemArray [0] .IsIn (". 00 "," 0.0 "," .25 "," 0.5 "," .5 ",". 50 "," .75 ");" was ich tun möchte, ist durch die Who-Datatable in der ersten Spalte zu sehen, ob die Werte in keiner der folgenden Zeichenketten enden. Wenn sie nicht wollen, dann möchte ich gebe einen String zurück, der besagt, dass zum Beispiel ein Wert '.00' fehlt. Ich benutze dein Beispiel nicht. Ich kann es nicht so einrichten, dass es funktioniert. Es ist ein wenig komplizierter, da ich keine Boole zurückgeben möchte funktioniert aber immer noch keine Vorschläge – MethodMan

+0

Dies scheint besser als eine Frage auf der Website gestellt. Gehen Sie weiter und beziehen Sie sich bei Bedarf auf diese Antwort. –

+0

Ich war tatsächlich in der Lage, eine tolle Möglichkeit zu finden, was ich tun wollte Ich schrieb etwas, das prüfen würde, ob Werte einer Zeichenfolge innerhalb einer for-Schleife für Datatables ItemArray mit einem der folgenden Werte enden meine Zeichenkette 'public static bool EndWithValue (dieser Zeichenkettenwert, IEnumerable Werte) { Rückgabewerte.Any (item => value.Endswith (item)); } ' – MethodMan