Überprüfen Sie, ob ein String-Array einen Wert enthält, und ermitteln Sie in diesem Fall seine Position


162

Ich habe dieses String-Array:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

Ich möchte feststellen, ob stringArrayenthält value. Wenn ja, möchte ich seine Position im Array lokalisieren.

Ich möchte keine Schleifen verwenden. Kann jemand vorschlagen, wie ich das machen könnte?

Antworten:


315

Sie können die Array.IndexOf- Methode verwenden:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}

1
... und ich benutze foreach seit Monaten. Übrigens ist dies rechnerisch schneller als die Antwort von BLUEPIXY? Oder langsamer?
Max von Hippel

2
Interessiert Array.IndexOfsich die Kapitalisierung? Tut "text1" == "TEXT1"?
BÖSE

Array.IndexOfGibt −1nur zurück, wenn der Index 0-begrenzt ist. Dieser Fall würde brechen, seien Sie sich also bewusst! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
Benscabbia

Dies ist nützlich, wenn Sie nach einer genauen Übereinstimmung suchen. Dies kann jedoch nützlich sein, wenn Sie sich nicht für Groß- und Kleinschreibung interessieren
Kyle Champion

72
var index = Array.FindIndex(stringArray, x => x == value)

7
Dies sollte die akzeptierte Antwort sein, da es einem erlaubt, ein Lambda zu übergeben, um kompliziertere Dinge wie Array.FindIndex (Array, x => x.StartsWith ("String hier einfügen")) zu
tun

1
Aber darum geht es in der Frage nicht. In der Frage wird gefragt, wie Sie einen bekannten Wert aus einem Array finden.
Karl Gjertsen

2
@ KarlGjertsen Ich möchte seine Position im Array finden
BLUEPIXY

Dies ist jedoch sehr nützlich, da es für mich sehr vorteilhaft war, so etwas wie ein x.ToUpper () ausführen zu können.
Mrshickadance

31

Wir können auch verwenden Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

1
Saubere und einfache Antwort
Aryan Firouzian

Wie überprüfe ich einzelne Werte? Als ich versuchte, ein char-Array auf ein char zu überprüfen, erhielt ich eine Nachricht, chardie nicht konvertiert werden kannSystem.Predicate<char>
Aaron Franke

13

EDIT: Ich hatte nicht bemerkt, dass Sie die Position auch brauchten. Sie können IndexOfeinen Wert eines Array-Typs nicht direkt verwenden, da er explizit implementiert ist. Sie können jedoch Folgendes verwenden:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(Dies ähnelt dem Aufrufen Array.IndexOfgemäß Darins Antwort - nur ein alternativer Ansatz. Mir ist nicht klar, warum dies explizit in Arrays implementiert ist , aber egal ...)IList<T>.IndexOf


Wie finde ich mithilfe von Contains den Besitz der Welt im Array?
MoShe

Gibt es eine Möglichkeit zu überprüfen, ob ein Zeichenfolgenelement in Zeichenfolgenarray A in einem anderen Zeichenfolgenarray B vorhanden ist?
Murali Murugesan

@MuraliMurugesan: Es ist nicht klar , was Sie fragen - ob die beiden Arrays haben alle Elemente gemeinsam? Ein bestimmter Artikel? (Im letzteren Fall ist die Tatsache, dass es sich auch in einem Array befindet, irrelevant.)
Jon Skeet

Ich habe versucht, hier auf stackoverflow.com/a/22812525/1559213 zu antworten . Ich habe mich gemeldet, um true / false für die Zeile Html.CheckBox zurückzugeben. Eigentlich gibt es ein Monatsarray und auch das Modell, das einige Monate hat. Wenn der Modellmonat im Monatsarray vorhanden ist, müssen wir true zurückgeben. Vielen Dank für die Raketenantwort :)
Murali Murugesan

@MuraliMurugesan: Nun, das klingt nachif (months.Contains(model.Month))
Jon Skeet

5

Sie können verwenden Array.IndexOf()- beachten Sie, dass -1 zurückgegeben wird, wenn das Element nicht gefunden wurde und Sie diesen Fall behandeln müssen.

int index = Array.IndexOf(stringArray, value);

4

Sie können es so versuchen ... Sie können Array.IndexOf () verwenden, wenn Sie die Position auch wissen möchten

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

3

IMO Der beste Weg, um zu überprüfen, ob ein Array einen bestimmten Wert enthält, ist System.Collections.Generic.IList<T>.Contains(T item)die folgende Methode:

((IList<string>)stringArray).Contains(value)

Vollständiges Codebeispiel:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[] Arrays implementieren privat einige Methoden von List<T> wie Count and Contains. Da es sich um eine explizite (private) Implementierung handelt, können Sie diese Methoden nicht verwenden, ohne zuerst das Array zu übertragen. Dies funktioniert nicht nur für Zeichenfolgen. Mit diesem Trick können Sie überprüfen, ob ein Array eines beliebigen Typs ein Element enthält, solange die Klasse des Elements IComparable implementiert.

Denken Sie nicht an alle IList<T> Methoden auf diese Weise funktionieren. Der Versuch, die IList<T>Add-Methode für ein Array zu verwenden , schlägt fehl.


2
Ihre Antwort ist im Grunde die gleiche wie die von Priyank. Es gibt nicht den Index des Elements an, nach dem das OP gefragt hat.
Reggaeguitar

@reggaeguitar Stimmen Sie dort zu!
Si8

Es ist die Lösung, nach der ich gesucht habe, obwohl sie die Frage nicht vollständig beantwortet.
Auspex

1

Sie können dies versuchen, es sucht nach dem Index, der dieses Element enthält, und es setzt die Indexnummer als int. Dann prüft es, ob das int größer als -1 ist. Wenn es also 0 oder mehr ist, bedeutet dies, dass es ein solches gefunden hat ein Index - da Arrays auf 0 basieren.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }

0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}

0

Ich habe eine Erweiterungsmethode zur Wiederverwendung erstellt.

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

Wie man es nennt:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

Wo ist das, positionwonach das OP fragt?
Si8

-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

Es gibt einen Fehler: 'System.Array' enthält keine Definition für 'enthält'.
ePandit

-4

Die einfachste und kürzere Methode wäre die folgende.

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
Die Frage war über das Finden der Position eines Elements in einem Array .... Mit der ContainsMethode haben Sie diese Informationen nicht
Bidou
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.