it-swarm.com.de

So suchen Sie einen String in einem String-Array

Ich muss einen String im String-Array suchen. Ich möchte keine verwenden, um sie zu durchlaufen

string [] arr = {"One","Two","Three"};

string theString = "One"

Ich muss überprüfen, ob die Variable String in arr vorhanden ist.

68
balaweblog

Jede zuvor erwähnte Methode führt interne oder externe Schleifen durch, daher ist es nicht wirklich wichtig, wie sie implementiert werden soll. Hier ein weiteres Beispiel für das Finden aller Referenzen der Zielzeichenfolge

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));
62
Tamir

Nun, irgendetwas muss aussehen, und Schleifen sind effizienter als Rekursionen (da die End-Rekursion nicht vollständig implementiert ist). Wenn Sie sich also nicht selbst schleifen möchten, können Sie Folgendes tun:

bool has = arr.Contains(var); // .NET 3.5

oder

bool has = Array.IndexOf(arr, var) >= 0;

Zur Information: Vermeiden Sie Namen wie var - Dies ist ein Schlüsselwort in C # 3.0.

115
Marc Gravell

Muss es ein String sein []? Eine Liste <String> würde Ihnen das geben, was Sie brauchen.

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
25
ZombieSheep
bool exists = arr.Contains("One");
11
mohammedn

Ich denke, es ist besser, Array.Exists als Array.FindAll .

10
Joe Cheri Ross

Es ist ziemlich einfach. Ich benutze diesen Code immer, um einen String aus einem String-Array zu suchen

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}
8
Sharp Coders

Wenn das Array sortiert ist, können Sie BinarySearch verwenden. Dies ist eine O (log n) -Operation, daher ist sie schneller als eine Schleife. Wenn Sie mehrere Suchvorgänge ausführen müssen und die Geschwindigkeit ein Problem darstellt, können Sie diese sortieren (oder kopieren), bevor Sie sie verwenden.

6
GvS

Jede Klasse, die IList implementiert, hat eine Methode Contains (Object value) . Und System.Array auch.

4
VolkerK

Warum das Verbot "Ich möchte keine Schleifen verwenden"? Das ist die naheliegendste Lösung. Wenn Sie die Chance haben, offensichtlich zu sein, nehmen Sie es!

Beachten Sie, dass Aufrufe wie arr.Contains(...) immer noch zu loop führen. Sie werden es einfach nicht sein, der die Schleife geschrieben hat.

Haben Sie eine alternative Darstellung in Betracht gezogen, die für die Suche besser geeignet ist?

  • Eine gute Set-Implementierung würde eine gute Leistung bringen. (HashSet, TreeSet oder das lokale Äquivalent).
  • Wenn Sie sicher sein können, dass arr sortiert ist, können Sie eine binäre Suche verwenden (die rekursiv oder in einer Schleife ausgeführt werden müsste, jedoch nicht so häufig wie eine gerade lineare Suche).
4
bendin

Auf den ersten Blick könnte ich mir so etwas einfallen lassen (aber es ist Pseudocode und unter der Annahme, dass Sie keine in .NET integrierten Bibliotheken verwenden können). Könnte ein bisschen Nachdenken und Überdenken erforderlich sein, sollte aber für einen Vorsprung ausreichen?

int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
    {
    if currentIndex > stringMaxIndex 
       return (-stringMaxIndex-1);
    else if var==arr[currentIndex] //or use any string comparison op or function
       return 0;
    else 
       return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
    }



    //calling code
    int index = findString(var, arr, 0, getMaxIndex(arr));

    if index == -1 printOnScreen("Not found");
    else printOnScreen("Found on index: " + index);
2
Salman Kasbati

Wenn Sie in C # eine ArrayList verwenden können, können Sie die Contains-Methode verwenden, die einen booleschen Wert zurückgibt:

if MyArrayList.Contains("One")
2
DOK

Sie können die Methode Find vom Typ Array verwenden. Ab .NET 3.5 und höher.

public static T Find<T>(
    T[] array,
    Predicate<T> match
)

Hier sind einige Beispiele:

// we search an array of strings for a name containing the letter “a”:
static void Main()
{
  string[] names = { "Rodney", "Jack", "Jill" };
  string match = Array.Find (names, ContainsA);
  Console.WriteLine (match);     // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }

Hier ist der gleiche Code, der mit einer anonymen Methode verkürzt wurde:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
  { return name.Contains ("a"); } ); // Jack

Ein Lambda-Ausdruck verkürzt es weiter:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a"));     // Jack
2
Yuliia Ashomok

Sie können die Existenz des Elements überprüfen, indem Sie

arr.Any(x => x == "One")
2
Ahmad