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?

MoShe
la source

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

Jon Skeet
la source
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);
Verre brisé
la source
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));
État d'énigme
la source
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.

pKami
la source
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");
            }
Mayer Spitzer
la source
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
la source
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
}
james31rock
la source
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.
}
Jaydeep Bhatt
la source
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.
}
Priyank Gajera
la source
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