8
votes

En opérateur en C #

Je pense qu'il y avait un opérateur dans em> dans Commodore 128 Basic.
Y a-t-il un opérateur en C # aussi?

Je veux dire, existe-t-il un opérateur de type p> xxx pré>

EDIT1: Actuellement, j'en ai besoin de décider si une valeur ENUM est dans une plage de valeurs d'énorme. P>

EDIT2: Merci à tous pour les solutions contenues (). Je vais l'utiliser dans le futur. Mais actuellement, j'ai besoin de valeurs d'énorme. Puis-je remplacer la déclaration suivante avec contient () ou d'autres méthodes? P>

public enum MyEnum { A, B, C }

class MyEnumHelper
{
  void IsSpecialSet(MyEnum e)
  {
    return e in [MyEnum.A, MyEnum.C]
  }
}


9 commentaires

Basé sur votre code, vous souhaitez voir si Astring est égal à "A", "B" ou "C", non si elle contient "A", "B" ou "C". Est-ce correct? Ça fait des années Saiunce J'ai regardé Commodor 128 basique, mais cela ressemble à un code de ramification typique pour moi si je me souviens bien.


Je ne me souviens pas de cela de C-128 basique (bien que vous vous ramène ...) mais c'est très proche de la syntaxe Python


Ouais, aucun dans dans n'importe quel années 1980 basique que je peux me souvenir.


@DAV Je veux dire que la chose égale ne contient pas la chose.


Ou, re: @ Andrevoi la réponse, vous pouvez faire: retourner nouveau [] {myenum.a, myenum.c} .Contains (e); . Alternativement, avec la méthode d'extension liée dans mon commentaire: retour e.in (myenum.a, myenum.c);


@ma c'était mon erreur. Je le savais de Turbo Pascal. J'ai mis à jour ma question, voir Edition3.


@DavidHeffernan c'était mon erreur. Je le savais de Turbo Pascal. J'ai mis à jour ma question, voir Edition3.


@Hekaneda merci. La méthode de l'extension est très intéressante. La réponse de Trevor Pilley est dans cette direction.


@brgerner a ajouté une réponse expliquant la différence entre les trois approches de la méthode d'extension.


12 Réponses :


12
votes

Essayez ceci:

if(new [] {"a", "b", "c"}.Contains(aString))  
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'");


6 commentaires

Y a-t-il une solution associée pour Enums?


@brgerner: Pour un peu de sucre syntaxique (qui a des avantages et des inconvénients), voir Stackoverflow.com/a/5320727/1169696 - Vous permet de faire si (myenumvalue.in (myenum.first, myenum.seconde, myenum.third)) {...}


@Le s'il était possible d'attribuer votre méthode d'extension uniquement à mon énumération, il était parfait.


Mise à jour de mon dernier commentaire: la réponse de Trevor Pilley résout ce problème.


Pas ma méthode d'extension, mais c'est possible. Ajout d'une réponse, puisqu'il prend de la place pour démontrer. Ne l'acceptez pas, cependant, depuis que nous sommes loin de votre question initiale, cela ne serait pas «juste».


Je suis curieux de savoir comment cela a une incidence sur la performance? Créa-t-il un tableau ou quelque chose ou il est juste iEnumerable qui devrait être optimal?



1
votes

La plupart des collections auront une méthode .Contains et Linq a également une méthode contenant, donc tout ce qui est en-témoine que cela n'a pas déjà sa propre méthode contient la méthode de Linq.


0 commentaires

3
votes

non. Vous pouvez rapprocher:

if (new [] { "a", "b", "c" }.Contains(aString))
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'");


1 commentaires

@Davidstratton en fait, je ne pense pas que ce soit le cas.



1
votes

Basé sur votre code, vous souhaitez voir si Astring est égal à "A", "B", ou "C", non si contient em> strong> "A", "B", ou "C". Si je lis la question à droite, alors:

Non. Au lieu de cela, vous utiliseriez un relevé d'interrupteur P>

switch(aString)
{
   case "a:":
   case "b:":
   case "b:":
      Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 
   default:
      Console.Out.WriteLine("aString is NOT 'a', 'b' or 'c'"); 
}


1 commentaires

Mais sa question est écrite de cette façon de démontrer la manière dont l'enquêteur souhaite utiliser la langue, pas les objectifs commerciaux réels.



3
votes

L'équivalent en C # serait contient () (en supposant que vous avez une liste ou une matrice de données) xxx

comme pour le dans mot clé, il a une utilisation différente: xxx


0 commentaires

1
votes

Utilisez la méthode Contient:

string[] values = { "A", "B", "C" };

if (values.Contains("A"))           //True
    MessageBox.Show("A is there");

if (values.Contains("b"))               //false, strings are case sensitive
    MessageBox.Show("b is there");  


0 commentaires

1
votes

Le mot clé n'est utilisé qu'avec des produits. Et non, il n'y a pas un tel opérateur dédié à cette fin. Mais vous pouvez utiliser des méthodes intégrées du type de tableau ou du type de liste, comme illustré ci-dessous:

        string aString = "a";
        string[] strings = new string[] { "a", "b", "c" };
        if (strings.Contains(aString)) //Contains here is a Linq extension
            Console.WriteLine("aString is either a, b, or c");

        List<string> stringList = new List<string>() { "a", "b", "c" };
        if(stringList.Contains(aString)) //Contains here is a member method
            Console.WriteLine("aString is either a, b, or c");

        if(stringList.IndexOf(aString) != -1)
            Console.WriteLine("aString is either a, b, or c");


0 commentaires

3
votes

Vous pouvez utiliser une méthode d'extension si vous souhaitez une manière légèrement plus fluide de travailler afin que cet exemple d'un statut client et de client:

private void DoSomething()
{
        var customer = new Customer
        {
            Status = CustomerStatus.Active
        };

        if (customer.Status.In(CustomerStatus.Active, CustomerStatus.Inactive))
        {
            // Do something.
        }
}


3 commentaires

Merci! Maintenant la meilleure réponse.


Une méthode d'extension générique serait plus utile: Static Static Bool dans (cette valeur T, paramètres t [] valeurs) {Valeurs de retour.Contains (valeur); } .


Oui c'est vrai, je l'ai fait spécifiquement si c'était ce que @Brgerner a posé une question. D'autres ont également posté des exemples utilisant des génériques.



1
votes

Pour répondre à une question de suivi sur la réponse de Andrew Hare, il est possible de limiter la méthode de l'extension à une seule énumération. N'acceptez pas cette réponse, puisque Andrew and Trevor a répondu à la question révisée (et la plupart répondaient à l'original ... de toute façon).

à récapituler, c'est ce que je trouve le plus utile: Httptps://stackoverflow.com/a/5320727/1169696

Mais si vous voulez vraiment vous limiter, c'est juste une question d'utilisation Le type de l'ENUM en tant que paramètre au lieu d'un générique (ou d'un énumé): xxx

Je trouve moins utile que le générique que j'ai lié - ou l'approche de Trevor - mais là-bas.

update

différence entre les approches:

  • Utilisation de la méthode de Trevor, les trois mélanges d'ennemi et d'ami dans le code ci-dessus seront acceptés par le compilateur (la sortie sera "vraie", "False", "False", "False", "Faux", " ")).

  • Utilisation de l'approche générique, le dernier sera accepté (et "vrai"), car les génériques garantissent uniquement que tous les paramètres (y compris ce ) sont du même type. C'est-à-dire, cela n'acceptera pas de mélanger différents Enums dans le même appel.

  • Celui ci-dessus, encore une fois, n'acceptera que l'enum que vous avez conçu la méthode de l'extension.


0 commentaires

0
votes

Je suis surpris que personne n'a proposé interrupteur : xxx


0 commentaires

2
votes

Essayez ceci:

if ("abc".Contains(aString[0])) 
  Console.WriteLine("aString is 'a', 'b' or 'c'");


0 commentaires

4
votes

Grâce à mes jours Delphes, je suis également habitué à son mot-clé dans strong>. Pour le cas générique en C #, j'utilise:

  var color = Color.Aqua;
  var b = color.In(Color.Black, Color.Blue);
  b = "hello".In("hello", "world");


0 commentaires