Je pense qu'il y avait un opérateur dans em> dans Commodore 128 Basic. Je veux dire, existe-t-il un opérateur de type p> 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>
Y a-t-il un opérateur en C # aussi? public enum MyEnum { A, B, C }
class MyEnumHelper
{
void IsSpecialSet(MyEnum e)
{
return e in [MyEnum.A, MyEnum.C]
}
}
12 Réponses :
Essayez ceci:
if(new [] {"a", "b", "c"}.Contains(aString)) Console.Out.WriteLine("aString is 'a', 'b' or 'c'");
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)) {...} code>
@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?
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. P>
non. Vous pouvez rapprocher:
if (new [] { "a", "b", "c" }.Contains(aString)) Console.Out.WriteLine("aString is 'a', 'b' or 'c'");
@Davidstratton en fait, je ne pense pas que ce soit le cas.
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'");
}
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.
L'équivalent en C # serait comme pour le contient () code>
(en supposant que vous avez une liste ou une matrice de données) dans code>
mot clé, il a une utilisation différente: p>
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");
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");
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. } }
Merci! Maintenant la meilleure réponse.
Une méthode d'extension générique serait plus utile: Static Static Bool dans
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.
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 code> code> à 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 p>
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é): p> Je trouve moins utile que le générique que j'ai lié - ou l'approche de Trevor - mais là-bas. p> update strong> p> différence entre les approches: p> 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", " ")). p> li>
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 Celui ci-dessus, encore une fois, n'acceptera que l'enum que vous avez conçu la méthode de l'extension. P> LI>
ul> p>
ce code>) sont du même type. C'est-à-dire, cela n'acceptera pas de mélanger différents Enums dans le même appel. P> li>
Je suis surpris que personne n'a proposé interrupteur code>:
Essayez ceci:
if ("abc".Contains(aString[0])) Console.WriteLine("aString is 'a', 'b' or 'c'");
Grâce à mes jours Delphes, je suis également habitué à son mot-clé var color = Color.Aqua;
var b = color.In(Color.Black, Color.Blue);
b = "hello".In("hello", "world");
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 code> dans n'importe quel années 1980 basique que je peux me souvenir.
@DAV Je veux dire que la chose égale b> ne contient pas la chose.
Ou, re: @ Andrevoi la réponse, vous pouvez faire:
retourner nouveau [] {myenum.a, myenum.c} .Contains (e); code>. Alternativement, avec la méthode d'extension liée dans mon commentaire:
retour e.in (myenum.a, myenum.c); code>
@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.