207 votes

Vérifier si une valeur est dans un tableau (C#)

Comment vérifier si une valeur se trouve dans un tableau en C# ?

Par exemple, je veux créer un tableau avec une liste de noms d'imprimantes.

Ces données seront transmises à une méthode qui examinera chaque chaîne à tour de rôle et, si la chaîne est identique à une valeur dans un tableau, effectuera cette action.

Par exemple :

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
   PrinterSetup(p);     
}

Ce sont les noms des imprimantes, ils sont transmis à la méthode PrinterSetup.

PrinterSetup ressemblera à ceci (un peu de pseudocode) :

public void PrinterSetup(printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

Comment puis-je formater if (printer == "jupiter") d'une manière que C# peut reconnaître ?

7voto

Philm Points 659

Remarque : La question porte sur les tableaux de chaînes de caractères. Les routines mentionnées ne doivent pas être mélangées avec la méthode .Contains des chaînes de caractères individuelles.

Je voudrais ajouter une réponse complémentaire concernant les différentes versions de C#, et ce pour deux raisons :

  • La réponse acceptée nécessite Linq, qui est parfaitement idiomatique du C#, mais qui n'est pas sans coût et n'est pas disponible dans le C# 2.0 ou inférieur. Lorsqu'il s'agit d'un tableau, les performances peuvent avoir de l'importance. Dans certaines situations, il est donc préférable de conserver les méthodes Array.

  • Aucune réponse ne répond directement à la question où il était également demandé de mettre cela dans une fonction (Comme certaines réponses mélangent également des chaînes de caractères avec des tableaux de chaînes de caractères, ce n'est pas complètement sans importance).

Array.Exists() est une méthode C#/.NET 2.0 et ne nécessite pas de Linq. La recherche dans les tableaux est O(n). Pour un accès encore plus rapide, utilisez HashSet ou des collections similaires.

Depuis .NET 3.5, il existe également une méthode générique Array<T>.Exists() :

public void PrinterSetup(string[] printer)
{
   if (Array.Exists(printer, x => x == "jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

Vous pourriez écrire une méthode d'extension propre (C# 3.0 et plus) pour ajouter le sucre syntaxique permettant d'obtenir le même ".Contains" que pour les chaînes de caractères pour tous les tableaux sans inclure Linq :

// Using the generic extension method below as requested.
public void PrinterSetup(string[] printer)
{
   if (printer.ArrayContains("jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

public static bool ArrayContains<T>(this T[] thisArray, T searchElement)
{
   // If you want this to find "null" values, you could change the code here
   return Array.Exists<T>(thisArray, x => x.Equals(searchElement));
}

Dans ce cas, cette ArrayContains() est utilisée et non la méthode Contains de Linq.

Les méthodes .Contains mentionnées ailleurs font référence à List<T>.Contains (depuis C# 2.0) ou ArrayList.Contains (depuis C# 1.1), mais pas aux tableaux eux-mêmes directement.

3voto

Brandon Moretz Points 4274

Je ne vois pas très bien quel est votre problème, mais on dirait que vous voulez quelque chose comme ça :

    List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } );

    if( printer.Exists( p => p.Equals( "jupiter" ) ) )
    {
        ...
    }

3voto

Sergey Brunov Points 4186

Envisagez d'utiliser HashSet<T> Classe pour des raisons de performances de recherche :

Cette méthode est une opération O(1).

- HashSet<T>.Contains Méthode (T), MSDN .

Par exemple :

class PrinterInstaller
{
    private static readonly HashSet<string> PrinterNames = new HashSet<string>
        {
            "jupiter", "neptune", "pangea", "mercury", "sonic"
        };

    public void Setup(string printerName)
    {
        if (!PrinterNames.Contains(printerName))
        {
            throw new ArgumentException("Unknown printer name", "printerName");
        }
        // ...
    }
}

2voto

Il vous manque juste quelque chose dans votre méthode :

public void PrinterSetup(string printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
   }
}

Il suffit d'ajouter string et tu iras bien.

1voto

Ricardo Fercher Points 187

J'ai cherché pendant plus de 2 heures pour trouver un moyen agréable. comment trouver les doublons dans une liste et comment les enlever . Voici la réponse la plus simple :

//Copy the string array with the filtered data of the analytics db into an list
// a list should be easier to use
List<string> list_filtered_data = new List<string>(analytics_db_filtered_data);

// Get distinct elements and convert into a list again.
List<string> distinct = list_filtered_data.Distinct().ToList();

Le résultat ressemblera à ceci : Les éléments dupliqués seront supprimés dans la nouvelle liste appelée distinct !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X