web-dev-qa-db-fra.com

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

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

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

Celles-ci seront transmises à une méthode, qui examinera chaque chaîne à son tour, et si la chaîne est identique à une valeur dans un tableau, effectuez cette action.

Par exemple:

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

Ce sont les noms des imprimantes, elles sont transmises à la méthode PrinterSetup.

PrinterSetup ressemblera à ceci (un pseudocode):

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

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

82
Cecil Rodriguez

Ajouter l'espace de noms nécessaire

using System.Linq;

Ensuite, vous pouvez utiliser la méthode linq Contains()

string[] printer = {"jupiter", "Neptune", "pangea", "mercury", "sonic"};
if(printer.Contains("jupiter"))
{
    Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}
185
Dmytro
   string[] array = { "cat", "dot", "perls" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perls");
bool b = Array.Exists(array, element => element == "python");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

// Display bools.
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
----------------------------output-----------------------------------

1) Vrai 2) Faux 3) Vrai 4) Faux

23
Akhilhh
if ((new [] {"foo", "bar", "baaz"}).Contains("bar"))
{

}  
19
Guest

Quelque chose comme ça?

string[] printer = {"jupiter", "Neptune", "pangea", "mercury", "sonic"};
PrinterSetup(printer);

// redefine PrinterSetup this way:
public void PrinterSetup(string[] printer)
{
    foreach (p in printer.Where(c => c == "jupiter"))
    {
        Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
    }
}
7
code4life
    public static bool Contains(Array a, object val)
    {
        return Array.IndexOf(a, val) != -1;
    }
5
Raz Megrelidze

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"");
   }
}

Ajoutez simplement string et tout ira bien.

4
user195488

Remarque: la question concerne les tableaux de chaînes. Les routines mentionnées ne doivent pas être mélangées avec la méthode .Contains de chaînes uniques.

J'aimerais ajouter une réponse extensible faisant référence à différentes versions de C # et pour deux raisons:

  • La réponse acceptée nécessite Linq, qui est parfaitement idiomatique en C #, alors que cela n’est pas gratuit, et n’est pas disponible dans les versions C # 2.0 ou inférieures. Les performances peuvent avoir une incidence sur les performances, ce qui implique que, dans certains cas, vous souhaitez conserver les méthodes Array.

  • Aucune réponse ne répond directement à la question où il a également été demandé de mettre cela dans une fonction (comme certaines réponses mélangent également des chaînes avec des tableaux de chaînes, cela 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 propre méthode d'extension (C # 3.0 et supérieure) pour ajouter le sucre syntaxique afin d'obtenir le même ".Contains" pour les chaînes de tous les tableaux sans inclure Linq:

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

public static bool Contains<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 méthode Contains() est utilisée et non celle 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 directement.

4
Philm

Ce n'est pas très clair quel est votre problème, mais il semblerait que vous souhaitiez quelque chose comme ceci:

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

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

Envisagez d'utiliser HashSet<T> Class à des fins 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");
        }
        // ...
    }
}
2
Sergey Brunov

J'ai cherché maintenant plus de 2h pour trouver un moyen bien comment trouver les doublons dans une liste et comment les supprimer. 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();

La sortie ressemblera à ceci: Les éléments dupliqués seront supprimés de la nouvelle liste appelée distinct!

1
Ricardo Fercher