Je dois rechercher une chaîne dans le tableau de chaînes. Je ne veux pas en utiliser pour la mettre en boucle
ssortingng [] arr = {"One","Two","Three"}; ssortingng var = "One"
Je dois vérifier si la variable var est présente dans arr.
Chaque méthode, mentionnée précédemment, fait de la 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
ssortingng [] arr = {"One","Two","Three"}; var target = "One"; var results = Array.FindAll(arr, s => s.Equals(target));
Eh bien, quelque chose va avoir à regarder, et le bouclage est plus efficace que la récursivité (puisque la récursivité de bout en bout n’est pas complètement implémentée) … donc si vous ne voulez pas vous boucler, alors:
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é dans C # 3.0.
Est-ce que ça doit être une chaîne []? Une liste
List testing = new List (); testing.Add("One"); testing.Add("Two"); testing.Add("Three"); testing.Add("Mouse"); bool inList = testing.Contains("Mouse");
bool exists = arr.Contains("One");
Je pense qu’il est préférable d’utiliser Array.Exists que Array.FindAll .
C’est assez simple. J’utilise toujours ce code pour rechercher une chaîne à partir d’un tableau de chaînes
ssortingng[] ssortingngArray = { "text1", "text2", "text3", "text4" }; ssortingng value = "text3"; int pos = Array.IndexOf(ssortingngArray, value); if (pos > -1) { return true; } else { return false; }
Chaque classe implémentant IList a une méthode Contains (valeur d’object) . Et System.Array aussi.
Si le tableau est sortingé, vous pouvez utiliser BinarySearch . Ceci est une opération O (log n), donc plus rapide en boucle. Si vous devez appliquer plusieurs recherches et que la vitesse est un problème, vous pouvez la sortinger (ou une copie) avant de l’utiliser.
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(...)
sont toujours en boucle , ce ne sera simplement pas vous qui avez écrit la boucle.
Avez-vous envisagé une représentation alternative plus propice à la recherche?
arr
est sortingé, vous pouvez utiliser la recherche binary (qui doit être récursive ou en boucle, mais pas aussi souvent qu’une recherche linéaire). Vous pouvez utiliser la méthode Find de type Array. A partir de .NET 3.5 et supérieur.
public static T Find( T[] array, Predicate match )
Voici quelques exemples:
// we search an array of ssortingngs for a name containing the letter “a”: static void Main() { ssortingng[] names = { "Rodney", "Jack", "Jill" }; ssortingng match = Array.Find (names, ContainsA); Console.WriteLine (match); // Jack } static bool ContainsA (ssortingng name) { return name.Contains ("a"); }
Voici le même code abrégé avec une méthode anonyme:
ssortingng[] names = { "Rodney", "Jack", "Jill" }; ssortingng match = Array.Find (names, delegate (ssortingng name) { return name.Contains ("a"); } ); // Jack
Une expression lambda le raccourcit davantage:
ssortingng[] names = { "Rodney", "Jack", "Jill" }; ssortingng match = Array.Find (names, n => n.Contains ("a")); // Jack
Au premier coup d’oeil, je pourrais proposer quelque chose comme ça (mais c’est du pseudo-code et en supposant que vous ne pouvez pas utiliser de bibliothèques intégrées .NET). Peut-être nécessiterait-il un peu de peaufinage et de reflection, mais devrait-il être suffisant pour commencer, peut-être?
int findSsortingng(Ssortingng var, Ssortingng[] ssortingngArray, int currentIndex, int ssortingngMaxIndex) { if currentIndex > ssortingngMaxIndex return (-ssortingngMaxIndex-1); else if var==arr[currentIndex] //or use any ssortingng comparison op or function return 0; else return findSsortingng(var, ssortingngArray, currentIndex++, ssortingngMaxIndex) + 1 ; } //calling code int index = findSsortingng(var, arr, 0, getMaxIndex(arr)); if index == -1 printOnScreen("Not found"); else printOnScreen("Found on index: " + index);
En C #, si vous pouvez utiliser une ArrayList, vous pouvez utiliser la méthode Contains, qui retourne un booléen:
if MyArrayList.Contains("One")
Vous pouvez vérifier l’existence de l’élément par
arr.Any(x => x == "One")