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.
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));
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.
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");
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 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;
}
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.
Chaque classe implémentant IList a une méthode Contains (Object value) . Et tout comme System.Array.
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?
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).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);
En C #, si vous pouvez utiliser un ArrayList, vous pouvez utiliser la méthode Contains, qui renvoie un booléen:
if MyArrayList.Contains("One")
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
Vous pouvez vérifier l'existence de l'élément en
arr.Any(x => x == "One")