web-dev-qa-db-fra.com

Comment rechercher une chaîne dans un tableau de chaînes

Je dois rechercher une chaîne dans le tableau de chaînes. Je ne veux pas en utiliser pour la boucle

string [] arr = {"One","Two","Three"};

string theString = "One"

J'ai besoin de vérifier si la variable String est présente dans arr.

68
balaweblog

Chaque méthode, mentionnée précédemment, effectue une boucle en interne ou en externe, il n'est donc pas vraiment important de la mettre en œuvre. Voici un autre exemple de recherche de toutes les références de la chaîne cible

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

Eh bien, il va falloir regarder et le bouclage est plus efficace que la récursion (car la récursion finale n'est pas totalement implémentée) ... alors si vous ne voulez pas vous mettre en boucle, alors l'une des solutions suivantes:

bool has = arr.Contains(var); // .NET 3.5

ou

bool has = Array.IndexOf(arr, var) >= 0;

Pour info: évitez les noms comme var - c'est un mot clé en C # 3.0.

115
Marc Gravell

Faut-il que ce soit une chaîne []? Une liste <String> vous donnerait ce dont vous avez besoin.

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");
25
ZombieSheep
bool exists = arr.Contains("One");
11
mohammedn

Je pense qu'il est préférable d'utiliser Array.Exists que Array.FindAll .

10
Joe Cheri Ross

C'est assez simple. J'utilise toujours ce code pour rechercher une chaîne dans un tableau de chaînes

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}
8
Sharp Coders

Si le tableau est trié, vous pouvez utiliser BinarySearch . C'est une opération O (log n), donc c'est plus rapide en boucle. Si vous devez appliquer plusieurs recherches et que la vitesse est un problème, vous pouvez le trier (ou une copie) avant de l'utiliser.

6
GvS

Chaque classe implémentant IList a une méthode Contains (Object value) . Et tout comme System.Array.

4
VolkerK

Pourquoi l'interdiction "Je ne veux pas utiliser de boucle"? C'est la solution la plus évidente. Lorsque vous avez la chance d'être évident, prenez-le!

Notez que les appels comme arr.Contains(...) vont toujours boucle, ce ne sera tout simplement pas vous qui aurez écrit la boucle.

Avez-vous envisagé une représentation alternative plus facile à rechercher?

  • Une bonne implémentation de Set serait performante. (HashSet, TreeSet ou l’équivalent local).
  • Si vous pouvez être sûr que arr est trié, vous pouvez utiliser la recherche binaire (qui aurait besoin d'être récursive ou en boucle, mais pas aussi souvent qu'une recherche linéaire directe).
4
bendin

Au début, je pourrais arriver à quelque chose comme ceci (mais c'est du pseudo-code et en supposant que vous ne pouvez utiliser aucune bibliothèque intégrée .NET). Peut nécessiter un peu de peaufinage et de repenser, mais devrait-il être assez bon pour prendre une longueur d'avance, peut-être?

int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
    {
    if currentIndex > stringMaxIndex 
       return (-stringMaxIndex-1);
    else if var==arr[currentIndex] //or use any string comparison op or function
       return 0;
    else 
       return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
    }



    //calling code
    int index = findString(var, arr, 0, getMaxIndex(arr));

    if index == -1 printOnScreen("Not found");
    else printOnScreen("Found on index: " + index);
2
Salman Kasbati

En C #, si vous pouvez utiliser un ArrayList, vous pouvez utiliser la méthode Contains, qui renvoie un booléen:

if MyArrayList.Contains("One")
2
DOK

Vous pouvez utiliser la méthode Find de type Array. À partir de .NET 3.5 et supérieur.

public static T Find<T>(
    T[] array,
    Predicate<T> match
)

Voici quelques exemples:

// we search an array of strings for a name containing the letter “a”:
static void Main()
{
  string[] names = { "Rodney", "Jack", "Jill" };
  string match = Array.Find (names, ContainsA);
  Console.WriteLine (match);     // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }

Voici le même code abrégé avec une méthode anonyme:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
  { return name.Contains ("a"); } ); // Jack

Une expression lambda le raccourcit davantage:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a"));     // Jack
2
Yuliia Ashomok

Vous pouvez vérifier l'existence de l'élément en

arr.Any(x => x == "One")
2
Ahmad