Ü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?

MoShe
quelle

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
}
Darin Dimitrov
quelle
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)
BLUEPIXY
quelle
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"));
Taran
quelle
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

Jon Skeet
quelle
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);
Glassplitter
quelle
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));
Enigma State
quelle
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.

pKami
quelle
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");
            }
Mayer Spitzer
quelle
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); }

}
user5248404
quelle
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
}
james31rock
quelle
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.
}
Jaydeep Bhatt
quelle
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.
}
Priyank Gajera
quelle
3
Die Frage war über das Finden der Position eines Elements in einem Array .... Mit der ContainsMethode haben Sie diese Informationen nicht
Bidou