Ist der String im Array?

107

Was wäre der beste Weg, um in einem string[]zu sehen, ob es ein Element enthält. Dies war mein erster Versuch. Aber vielleicht gibt es etwas, das ich übersehen habe. Die Array-Größe darf nicht größer als 200 Elemente sein.

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

Antworten:

210

Verwenden Sie einfach die bereits integrierte Contains () -Methode:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
Dave Markle
quelle
Aus irgendeinem Grund konnte ich die Methode, als ich sie zum ersten Mal suchte, nicht finden ... danke.
Brad
4
@Brad: Das liegt daran, dass es sich um eine Erweiterungsmethode handelt, die von Enumerable stammt.
AnthonyWJones
8
Als Einzeiler:(new string[] { "foo", "bar" }).Contains("foo")
Denis V
8
Noch kürzer:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot
25

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

Sie können meinen Blog-Beitrag lesen , um weitere Informationen dazu zu erhalten. Die Hauptidee ist jedoch folgende:

Durch Hinzufügen dieser Erweiterungsmethode zu Ihrem Code:

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

Sie können Ihre Suche folgendermaßen durchführen:

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

Es funktioniert bei jedem Typ (solange Sie eine gute Gleichheitsmethode erstellen). Jeder Werttyp sicher.

Gabriel McAdams
quelle
Ich var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");möchte so etwas wie das, was ich tun möchte, durch die who-Datentabelle in der ersten Spalte schauen, um zu sehen, ob die Werte nicht in einer der folgenden Zeichenfolgen enden. Wenn dies nicht der Fall ist, möchte ich eine Zeichenfolge zurückgeben, die dies angibt es ist ein Wert fehlt .00zum Beispiel Ihr Beispiel verwendet , kann ich nicht zu arbeiten , diese zu bekommen scheinen , es ist ein bisschen schwieriger , da ich nicht keinen String ein Bool kehre ich verändert Ihre Methode zurückzukehren , aber immer noch nicht funktioniert wollen Anregungen
MethodMan
Dies scheint besser als eine Frage auf der Website gestellt zu werden. Verweisen Sie bei Bedarf auf diese Antwort.
Gabriel McAdams
Ich war tatsächlich in der Lage, eine großartige Möglichkeit zu finden, um das zu tun, was ich tun wollte. Ich habe etwas geschrieben, das prüft, ob die Werte einer Zeichenfolge in einer for-Schleife für Datatables ItemArray mit einem der folgenden Werte enden, die ich in meinem hatte Zeichenfolge public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan
12

Sie suchen einfach nach der Array.Exists-Funktion (oder nach der Contains-Erweiterungsmethode, wenn Sie .NET 3.5 verwenden, was etwas praktischer ist).

Noldorin
quelle
3
Hier ist ein funktionierendes Beispiel für .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Getankt
7

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 Anforderung

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

quelle
2

Arrays sind im Allgemeinen eine schlechte Datenstruktur, wenn Sie fragen möchten, ob sich ein bestimmtes Objekt in der Sammlung befindet oder nicht.

Wenn Sie diese Suche häufig ausführen, lohnt es sich möglicherweise, Dictionary<string, something>ein Array anstelle eines Arrays zu verwenden. Suchvorgänge in einem Wörterbuch sind O (1) (konstante Zeit), während das Durchsuchen des Arrays O (N) ist (benötigt Zeit proportional zur Länge des Arrays).

Selbst wenn das Array nur aus maximal 200 Elementen besteht, ist das Wörterbuch bei vielen dieser Suchvorgänge wahrscheinlich schneller.

Zack Elan
quelle
1
binäre Suche ist O (log n); Wörterbuch unterliegt O (1) - aber es gibt viel Overhead; Bei kleinen bis mittleren Größen kann die lineare Suche oder die binäre Suche eine überdurchschnittliche Leistung erbringen.
Marc Gravell
1

Sie können auch LINQ verwenden, um über das Array zu iterieren. oder Sie können die Find-Methode verwenden, bei der ein Delegat danach sucht. Ich denke jedoch, dass die Suchmethode etwas teurer ist, als nur eine Schleife durchzuführen.

masfenix
quelle
Die Find-Methode ist algorithmisch identisch mit der "Loop-Through" -Methode. Jeder zusätzliche Aufwand ist eine Objekterstellung und möglicherweise ein oder zwei Indirektionsebenen. Wenn Sie sich jedoch Sorgen machen, diese auf Kosten der Lesbarkeit zu optimieren, sorgen Sie sich um die falschen Dinge.
AwesomeTown
1

Wie im obigen Thread oft erwähnt, hängt es vom verwendeten Framework ab. .Net Framework 3 und höher verfügt über die Methoden .Contains () oder Exists () für Arrays. Für andere Frameworks unten können Sie den folgenden Trick ausführen, anstatt das Array zu durchlaufen ...

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

Ich bin mir der Effizienz nicht sicher ... Dave

Dave
quelle
0

Dies ist schneller als das manuelle Durchlaufen des Arrays:

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

        if (strArray.Contains(key))
            return true;
        return false;
    }
Chris Ballance
quelle
Die Verwendung von LINQ ist schneller als das Durchlaufen der Zeichenfolge, wie im Beispiel beschrieben. strArray.Contains (Schlüssel) ist alles, was wirklich notwendig ist
Chris Ballance
3
Hinter den Kulissen durchläuft strArray.Contains (Schlüssel) ohnehin nur das Array ... es gibt keine Magie, die Sie davon abhält, eine O (n) -Suche durchzuführen.
AwesomeTown
0

Wenn Sie Linq nicht verwenden möchten oder können, können Sie auch die statische Array.Exists(...);Funktion verwenden:

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

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

Wenn das Prädikat true zurückgibt, ist catInside ebenfalls true.

mateiasu
quelle