Y at-il une meilleure façon d'écrire une nouvelle liste { « a », « b »}. Contient (str)?

StackOverflow https://stackoverflow.com/questions/1339539

Question

Je veux vérifier si une chaîne est contenue dans une courte liste de chaînes. Actuellement, le code est comme ceci:

if (new List<string> { "A", "B", "C" }.Contains (str)) {

Cependant, cela semble pléthorique. Par exemple, IIRC, en Java, je pourrais simplement écrire {"A", "B", "C"}.Contains(str) ce qui serait bien préférable à ce qui précède.

Je suis sûr qu'il ya une meilleure façon en C #. Pourriez-vous l'indiquer?

Était-ce utile?

La solution

Vous pouvez écrire une méthode d'extension:

public static bool In<T>(this T obj, params T[] candidates)
{
    return obj.In((IEnumerable<T>)candidates);
}

public static bool In<T>(this T obj, IEnumerable<T> candidates)
{
    if(obj == null) throw new ArgumentNullException("obj");
    return (candidates ?? Enumerable.Empty<T>()).Contains(obj);
}

Que vous pouvez ensuite utiliser pour faire:

if(str.In("A", "B", "C")) { ... }

Autres conseils

Je suppose que vous pouvez raccourcir jusqu'à:

if ((new []{ "A", "B", "C" }).Contains (str)) {

Je ne sais pas combien d'une différence réelle il serait bien.

Mise à jour: si vous savez que vous allez tester exactement une lettre, je ne vois aucune raison de faire une liste ou un tableau de celui-ci:

if ("ABC".Contains(str)) {

Ce code est à la fois plus court et plus rapide. Mais là encore, je suppose que les chaînes d'une seule lettre étaient simplement des échantillons ...

Qu'en est-il cette approche:

"A;B;C".Split(';').Contains(str);

Pour changer complètement jusqu'à:

switch(str){
    case "A":
    case "B":
    case "C":
       contains = true;
       break;

    default:
       contains = false;
       break;
}

Si votre courte liste de chaînes sont constantes, vous devez utiliser un tableau de chaînes readonly statique.

L'avantage est qu'il est facile d'écrire et il n'instancier pas nouvelle liste chaque fois que vous devez effectuer la vérification.

private static readonly string[] Names = new string[] { "A", "B", "C" };

...

if (Names.Contains(str)) {

Cependant, cette solution est évolutive que la recherche se fait de façon linéaire. Vous pouvez également définir votre tableau constante de façon triée et utiliser BinarySearch sur le tableau.

// this has to be sorted
private static readonly string[] Names = new string[] { "A", "B", "C" };

...

if (Array.BinarySearch(Names, str) >= 0) {
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top