Vérifier si un tableau de chaînes contient une valeur, et si oui, obtenir sa position


163

J'ai ce tableau de chaînes:

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

Je voudrais déterminer si stringArraycontient 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 faire cela?

Réponses:


317

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
}

1
... Et j'utilise foreach depuis des mois. BTW est ce calcul plus rapide que la réponse de BLUEPIXY? Ou plus lentement?
Max von Hippel

2
Se Array.IndexOfsoucie- t- il de la capitalisation? Le fait "text1" == "TEXT1"?
EVIL

Array.IndexOfrenvoie −1uniquement si l'index est limité à 0. Cette affaire se briserait, alors soyez conscient! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

Ceci est utile si vous recherchez une correspondance exacte. Cependant, cela peut être utile si vous ne vous souciez pas de la casse: Comment ajouter une option insensible à la casse à Array.IndexOf
Kyle Champion

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

7
Cela devrait être la réponse acceptée car elle permet de passer dans un lambda pour faire des choses plus compliquées comme Array.FindIndex (array, x => x.StartsWith ("insert string here"))
reggaeguitar

1
Mais ce n'est pas ce que demande la question. La question demande comment trouver une valeur connue dans un tableau.
Karl Gjertsen

2
@KarlGjertsen Je veux localiser sa position dans le tableau
BLUEPIXY

Ceci est très utile cependant, pouvoir faire quelque chose comme un x.ToUpper () m'a été très bénéfique.
mrshickadance

31

Nous pouvons également 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"));

1
Réponse propre et simple
Aryan Firouzian

Comment vérifier les valeurs individuelles? Quand j'ai essayé de vérifier un tableau de caractères pour un caractère, j'ai reçu un message qui charne peut pas être converti enSystem.Predicate<char>
Aaron Franke

13

EDIT: Je n'avais pas remarqué que vous aviez également besoin du poste. Vous ne pouvez pas utiliser IndexOfdirectement sur une valeur de type tableau, car il est implémenté 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.IndexOfselon la réponse de Darin - juste une approche alternative. Je ne vois pas pourquoi est implémenté explicitement dans les tableaux, mais tant pis ...)IList<T>.IndexOf


comment trouver la possession du monde dans le tableau en utilisant Contains?
MoShe

Existe-t-il une possibilité de vérifier qu'un élément de chaîne dans le tableau de chaînes A existe dans un autre tableau de chaînes B?
Murali Murugesan

@MuraliMurugesan: Ce que vous demandez n'est pas clair - si les deux tableaux ont des éléments en commun? Un élément spécifique ? (Dans ce dernier cas, le fait qu'il soit également dans un tableau n'est pas pertinent.)
Jon Skeet

J'essayais de répondre ici stackoverflow.com/a/22812525/1559213 . J'ai frappé pour retourner vrai / faux pour la ligne Html.CheckBox. En fait, il y a un tableau de mois et aussi le modèle qui a quelques mois. Si le mois du modèle est présent dans le tableau des mois, nous devons renvoyer true. Merci pour la réponse de la fusée :)
Murali Murugesan

@MuraliMurugesan: Eh bien, cela ressemble àif (months.Contains(model.Month))
Jon Skeet

5

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

4

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

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

3

IMO, la meilleure façon de vérifier si un tableau contient une valeur donnée est d'utiliser la System.Collections.Generic.IList<T>.Contains(T item)méthode 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.");

T[] les tableaux implémentent en privé 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 lancer d'abord 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, tant que la classe de l'élément implémente IComparable.

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


2
La vôtre est fondamentalement la même réponse que celle de Priyank. Il ne donne pas l'indice de l'élément qui est ce que l'OP demandait.
reggaeguitar

@reggaeguitar D'accord avec vous là-bas!
Si8

C'est la solution que je recherchais, même si elle ne répond pas complètement à la question.
Auspex

1

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

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

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
}

Où est ce positionque le PO demande?
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.
}

Cela donne une erreur: «System.Array» ne contient pas de définition pour «contient».
ePandit

-4

La méthode la plus simple et la plus courte serait la suivante.

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

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

3
La question était de trouver la position d'un élément dans un tableau .... Avec la Containsméthode vous n'avez pas cette information
Bidou
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.