web-dev-qa-db-fra.com

Vérifier si un tableau de chaînes contient une valeur et, le cas échéant, obtenir sa position

J'ai ce tableau de chaînes:

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

Je voudrais déterminer si stringArray contient value. Si tel est le cas, je souhaite localiser sa position dans le tableau.

Je ne veux pas utiliser de boucles. Quelqu'un peut-il suggérer comment je pourrais le faire?

144
MoShe

Vous pouvez utiliser la méthode 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
}
283
Darin Dimitrov
var index = Array.FindIndex(stringArray, x => x == value)
67
BLUEPIXY

On peut aussi utiliser 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"));
23
Taran

EDIT: Je n'avais pas remarqué que vous aviez également besoin du poste. Vous ne pouvez pas utiliser IndexOf directement sur une valeur de type tableau, car elle est implémentée explicitement. Cependant, vous pouvez utiliser:

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

(Ceci est similaire à l'appel Array.IndexOf selon la réponse de Darin - juste une approche alternative. Je ne comprends pas bien pourquoi IList<T>.IndexOf est implémenté explicitement dans les tableaux, mais peu importe ...)

12
Jon Skeet

Vous pouvez utiliser Array.IndexOf() - notez qu'il retournera -1 si l'élément n'a pas été trouvé et que vous devez gérer ce cas.

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

vous pouvez essayer comme ça ... vous pouvez utiliser Array.IndexOf (), si vous voulez connaître la position aussi

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

Le meilleur moyen de vérifier si un tableau contient une valeur donnée consiste à utiliser la méthode System.Collections.Generic.IList<T>.Contains(T item) de la manière suivante:

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

Exemple de code complet:

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.");

Les tableaux T[] implémentent de manière privée quelques méthodes de List<T>, telles que Count et Contains. Comme il s'agit d'une implémentation explicite (privée), vous ne pourrez pas utiliser ces méthodes sans avoir préalablement transtypé le tableau. Cela ne fonctionne pas seulement pour les chaînes - vous pouvez utiliser cette astuce pour vérifier si un tableau de n'importe quel type contient un élément quelconque, à condition que la classe de l'élément implémente IComparable.

N'oubliez pas que toutes les méthodes IList<T> ne fonctionnent pas de cette façon. Essayer d'utiliser la méthode IList<T> de Add sur un tableau échouera.

3
pKami

Vous pouvez essayer ceci, il recherche l'index contenant cet élément et définit le numéro d'index comme int, puis il vérifie si l'int est supérieur à -1, donc s'il vaut 0 ou plus, cela signifie qu'il l'a trouvé un index - comme les tableaux sont basés sur 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");
            }
1
Mayer Spitzer
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
user5248404

J'ai créé une méthode d'extension pour la réutilisation.

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

        return false;
    }

Comment l'appeler:

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