La chaîne est-elle dans le tableau?

107

Quelle serait la meilleure façon de regarder dans un string[]pour voir s'il contient un élément. C'était ma première chance. Mais il y a peut-être quelque chose que je néglige. La taille du tableau ne dépassera pas 200 éléments.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}
Brad
la source

Réponses:

210

Utilisez simplement la méthode Contains () déjà intégrée:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
Dave Markle
la source
Pour une raison quelconque, lorsque j'ai cherché la méthode pour la première fois, je ne l'ai pas trouvée ... merci.
Brad
4
@Brad: C'est parce que c'est une méthode d'extension provenant d'Enumerable.
AnthonyWJones
8
En one-liner:(new string[] { "foo", "bar" }).Contains("foo")
Denis V
8
Encore plus court:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot
25

Je sais que c'est vieux, mais je voulais que les nouveaux lecteurs sachent qu'il existe une nouvelle méthode pour le faire en utilisant des méthodes génériques et d'extension.

Vous pouvez lire mon article de blog pour voir plus d'informations sur la façon de procéder, mais l'idée principale est la suivante:

En ajoutant cette méthode d'extension à votre code:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

vous pouvez effectuer votre recherche comme ceci:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

Cela fonctionne sur n'importe quel type (tant que vous créez une bonne méthode d'égalité). Tout type de valeur à coup sûr.

Gabriel McAdams
la source
J'ai quelque chose comme ça, var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");ce que je veux faire est de regarder à travers le qui datable dans la première colonne pour voir si les valeurs ne se terminent par aucune des chaînes suivantes .. si ce n'est pas le cas, je veux renvoyer une chaîne indiquant que il manque une valeur, .00par exemple en utilisant votre exemple, je n'arrive pas à faire fonctionner celui-ci, c'est un peu plus délicat car je ne veux pas renvoyer un booléen J'ai modifié votre méthode pour renvoyer une chaîne mais ne fonctionne toujours pas de suggestions
MethodMan
Cela semble mieux posé comme une question sur le site. Allez-y et référencez cette réponse si nécessaire.
Gabriel McAdams
J'ai en fait pu trouver un moyen génial de faire ce que je voulais faire.J'ai écrit quelque chose qui vérifierait si les valeurs d'une chaîne à l'intérieur d'une boucle for pour Datatables ItemArray, se terminent par l'une des valeurs suivantes que j'avais dans mon string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan
12

Vous recherchez simplement la fonction Array.Exists (ou la méthode d'extension Contains si vous utilisez .NET 3.5, ce qui est légèrement plus pratique).

Noldorin
la source
3
Voici un exemple de travail pour .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
alimenté le
7

Linq (pour les s & g):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

ou, selon les besoins

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));

la source
6

Le tableau est-il trié? Si c'est le cas, vous pouvez faire une recherche binaire . Voici également l'implémentation .NET. Si le tableau est trié, une recherche binaire améliorera les performances par rapport à toute solution itérative.

Andrew Hare
la source
2

Les tableaux sont, en général, une structure de données médiocre à utiliser si vous souhaitez demander si un objet particulier est dans la collection ou non.

Si vous exécutez cette recherche fréquemment, cela peut valoir la peine d'utiliser un Dictionary<string, something>tableau plutôt qu'un tableau. Les recherches dans un dictionnaire sont O (1) (temps constant), tandis que la recherche dans le tableau est O (N) (prend un temps proportionnel à la longueur du tableau).

Même si le tableau ne contient que 200 éléments au maximum, si vous effectuez un grand nombre de ces recherches, le dictionnaire sera probablement plus rapide.

Zack Elan
la source
1
la recherche binaire est O (log n); dictionnaire sous-tend à O (1) - mais il y a beaucoup de surcharge; pour les petites et moyennes tailles, la recherche linéaire ou la recherche binaire peut surpasser.
Marc Gravell
1

Vous pouvez également utiliser LINQ pour parcourir le tableau. ou vous pouvez utiliser la méthode Find qui prend un délégué pour le rechercher. Cependant, je pense que la méthode de recherche est un peu plus chère que la simple boucle.

Masfenix
la source
La méthode Find sera algorithmiquement identique à la méthode «en boucle». Toute dépense supplémentaire sera la création d'objets et peut-être une couche ou deux d'indirection, mais si vous vous inquiétez de l'optimiser au détriment de la lisibilité, vous vous inquiétez des mauvaises choses.
AwesomeTown
1

Comme mentionné à plusieurs reprises dans le fil ci-dessus, cela dépend du cadre utilisé. .Net Framework 3 et supérieur a les méthodes .Contains () ou Exists () pour les tableaux. Pour les autres frameworks ci-dessous, vous pouvez faire l'astuce suivante au lieu de parcourir un tableau ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

Pas trop sûr de l'efficacité ... Dave

Dave
la source
0

C'est plus rapide que d'itérer manuellement dans le tableau:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }
Chris Ballance
la source
l'utilisation de LINQ est plus rapide que l'itération dans la chaîne comme cela a été fait dans l'exemple. strArray.Contains (key) est tout ce qui est vraiment nécessaire
Chris Ballance
3
Dans les coulisses, strArray.Contains (key) va de toute façon boucler le tableau ... il n'y a pas de magie impliquée qui vous empêche de faire une recherche O (n).
AwesomeTown
0

Si vous ne voulez pas ou ne pouvez tout simplement pas utiliser Linq, vous pouvez également utiliser la Array.Exists(...);fonction statique :

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

Lorsque le prédicat retourne true une fois, catInside sera également vrai.

mateiasu
la source