web-dev-qa-db-fra.com

La chaîne est-elle dans un tableau?

Quelle serait la meilleure façon de regarder dans un string[] pour voir s'il contient un élément. C'était mon premier coup. Mais peut-être qu'il y a quelque chose que je néglige. La taille du tableau ne sera pas supérieure à 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;
}
97
Brad

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

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
192
Dave Markle

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

Vous pouvez lire mon article de blog pour voir plus d'informations sur la procédure à suivre, mais voici l'idée principale:

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 méthode good equals). Tout type de valeur à coup sûr.

24
Gabriel McAdams

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

12
Noldorin

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

6
Andrew Hare

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

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

Si vous effectuez cette recherche fréquemment, il peut être intéressant d’utiliser un Dictionary<string, something> 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 le temps proportionnellement à la longueur du tableau).

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

2
Zack Elan

Comme mentionné à plusieurs reprises dans le fil de discussion ci-dessus, cela dépend du framework 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 utiliser l’astuce suivante au lieu de parcourir en boucle un tableau ...

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

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

1
Dave

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 lecture en boucle.

1
masfenix

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

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 redevient vrai une fois que catInside le sera également.

0
mateiasu

C'est plus rapide que de parcourir manuellement le tableau:

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

        if (strArray.Contains(key))
            return true;
        return false;
    }
0
Chris Ballance