Verifica se un array di stringhe contiene un valore e, in tal caso, ottenerne la posizione


163

Ho questo array di stringhe:

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

Vorrei determinare se stringArraycontiene value. In tal caso, voglio individuare la sua posizione nella matrice.

Non voglio usare i loop. Qualcuno può suggerire come potrei farlo?

Risposte:


317

È possibile utilizzare il metodo Array.IndexOf :

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
... E sto usando foreach da mesi. A proposito, questo è più veloce dal punto di vista computazionale della risposta di BLUEPIXY? O più lento?
Max von Hippel,

2
Si Array.IndexOfpreoccupa della capitalizzazione? Fa "text1" == "TEXT1"?
MALE

Array.IndexOfritorna −1solo se l'indice è limitato a 0. Questo caso si spezzerebbe, quindi fai attenzione! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia,

Questo è utile se stai cercando una corrispondenza esatta. Tuttavia, questo potrebbe essere utile se non ti interessa il caso: come aggiungere un'opzione senza distinzione tra maiuscole e minuscole a Array.IndexOf
Kyle Champion

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

7
Questa dovrebbe essere la risposta accettata perché permette di passare a una lambda per fare cose più complicate come Array.FindIndex (array, x => x.StartsWith ("inserisci stringa qui"))
reggaeguitar

1
Ma non è questa la domanda. La domanda si pone come si trova un valore noto da un array.
Karl Gjertsen,

2
@KarlGjertsen Voglio localizzare la sua posizione nella matrice
BLUEPIXY,

Questo è molto utile, però, essere in grado di fare qualcosa come un x.ToUpper () è stato molto utile per me.
Mrshickadance,

31

Possiamo anche usare 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
Risposta semplice e
chiara

Come posso controllare i singoli valori? Quando ho provato a controllare un array di caratteri per un carattere, ho ricevuto un messaggio che charnon può essere convertito inSystem.Predicate<char>
Aaron Franke,

13

EDIT: Non avevo notato che anche tu avevi bisogno della posizione. Non è possibile utilizzare IndexOfdirettamente su un valore di un tipo di array, poiché è implementato in modo esplicito. Tuttavia, puoi usare:

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

(Questo è simile alla chiamata Array.IndexOfsecondo la risposta di Darin - solo un approccio alternativo. Non mi è chiaro perché sia implementato esplicitamente negli array, ma non importa ...)IList<T>.IndexOf


come trovo il possesso del mondo nell'array usando Contains?
Lun

Esiste la possibilità di controllare un elemento stringa nell'array di stringhe A esiste in un altro array di stringhe B?
Murali Murugesan,

@MuraliMurugesan: Non è chiaro quello che stai chiedendo - se i due array hanno eventuali elementi in comune? Un oggetto specifico ? (In quest'ultimo caso, il fatto che sia anche in un array è irrilevante.)
Jon Skeet

Stavo cercando di rispondere qui stackoverflow.com/a/22812525/1559213 . Ho colpito per restituire vero / falso per la linea Html.CheckBox. In realtà c'è un array di mesi e anche il modello che ha alcuni mesi. Se il mese del modello è presente nell'array dei mesi, dobbiamo restituire true. Grazie per la risposta al razzo :)
Murali Murugesan,

@MuraliMurugesan: Beh, sembraif (months.Contains(model.Month))
Jon Skeet,

5

Puoi usare Array.IndexOf()- nota che restituirà -1 se l'elemento non è stato trovato e devi gestire questo caso.

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

4

puoi provare così ... puoi usare Array.IndexOf (), se vuoi conoscere anche la posizione

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

3

Il modo migliore per verificare se un array contiene un determinato valore è usare il System.Collections.Generic.IList<T>.Contains(T item)metodo nel modo seguente:

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

Esempio di codice completo:

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[] gli array implementano privatamente alcuni metodi di List<T> , come Count e Contains. Poiché si tratta di un'implementazione esplicita (privata), non sarà possibile utilizzare questi metodi senza eseguire prima il casting dell'array. Questo non funziona solo per le stringhe: puoi usare questo trucco per verificare se un array di qualsiasi tipo contiene qualche elemento, purché la classe dell'elemento implementi IComparable.

Tieni presente che non tutti i IList<T>metodi funzionano in questo modo. Il tentativo di utilizzare IList<T>il metodo Aggiungi su un array non riuscirà.


2
La tua è sostanzialmente la stessa risposta di Priyank. Non fornisce l'indice dell'elemento che è ciò che l'OP stava chiedendo.
reggaeguitar,

@reggaeguitar D'accordo con te lì!
Si8,

È la soluzione che stavo cercando, anche se non risponde completamente alla domanda.
Auspex,

1

Puoi provare questo, cerca l'indice che contiene questo elemento e imposta il numero di indice come int, quindi controlla se int è maggiore di -1, quindi se è 0 o più, significa che ha trovato tale un indice - poiché le matrici sono basate su 0.

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

Ho creato un metodo di estensione per il riutilizzo.

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

        return false;
    }

Come chiamarlo:

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

Dov'è positionl'OP che chiede?
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.
}

Dà errore: "System.Array" non contiene una definizione per "contiene".
ePandit,

-4

Il metodo più semplice e più breve sarebbe il seguente.

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

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

3
La domanda era su come trovare la posizione di un elemento in un array .... Con il Containsmetodo non hai queste informazioni
Bidou,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.