7
votes

Comparer simple si un énumé est dans une liste d'énums

J'ai l'énum suivant:

if ( myMat == Materials.Walkable )


0 commentaires

5 Réponses :


1
votes
var walkableAreas = AllAreas.Where(area => area.walkable);
if(walkableAreas.Contains(myArea) { //dostruff // }

0 commentaires

14
votes

Vous pouvez créer une méthode d'extension: xxx pré>

et l'utiliser comme: p> xxx pré>

Si vous le souhaitez, vous pouvez également utiliser un [indicateurs] Enum: p>

Materials myMat = ..
bool isMyMatWalkable = (myMat & Materials.Walkable) != Materials.None;


12 commentaires

ne savait pas que c'était possible dans C #


Pourquoi définissez-vous les valeurs numériques pour toutes les valeurs ENUM? Je pense que le régler juste pour Aucun (et walkable ) fonctionnerait aussi bien.


Afin de leur faire des drapeaux de bits, vous voulez vous assurer qu'ils sont des pouvoirs de 2. Sinon, vos valeurs commencent à 0 et augmentent par 1.


Je le fais comme suit: si ((((matériaux.water & matériaux.walkable)! = Matériaux.none) console.writeline ("mauvais"); Si ((matériaux et matériaux et matériaux.walkable)! = matériaux.none) console.writeine ​​("vrai"); if ((matériaux.water & matériaux.unwalkable)! = matériaux.none) console.writeline ("vrai"); si ((matériaux.wood & matériaux.unwalkable)! = matériaux.none) console.writeline ("faux"); Il fonctionne comme vous le souhaitez, mais n'est pas une solution "plus simple" sans créer une méthode pour ça


@svick: Ensuite, les combinaisons boits ne fonctionnaient pas correctement. Nous comptons sur le fait que chaque valeur d'énorme «non complexe» est associée à un bit spécifique étant défini.


@Xavjer: Je ne sais pas ce que vous essayez d'accomplir dans cet exemple. Tout est une constante, non? Ou vous n'aimez pas le modèle (x & y) == z? Extraire cela dans une méthode si vous voulez.


@Ani, je pensais [drapeaux] est-ce automatiquement. J'avais tort.


@svick: [Drapeaux] est principalement de communiquer l'intention, bien qu'il ait des effets agréables comme un plus lisible () .


@Ani qui n'était qu'un exemple, j'utilise des variables là-bas bien sûr. Je voulais juste montrer que cela me donne le résultat correct, mais c'est une méthode très spéciale pour écrire cela. Mais je pense que je n'aurai pas d'autre choix alors :)


@Xavjer: Si vous recherchez une brièveté, je doute que vous ferez beaucoup mieux que la méthode de l'extension. :)


Pourquoi ne pouvez-vous pas simplement utiliser un code standard enum et utiliser un code similaire à: bool iswalkable = mymat


@Chris: Dans ce cas, oui, vous pourriez le faire. Je préfère ne pas créer de commandes dans Enums autant que possible. Avec cette approche, nous pourrions ajouter un autre "complexe" drapeaux comme grekelement = air | Eau | Terre | Feu | Éther facilement.



1
votes

Vous pouvez essayer de créer un attribut personnalisé pour marquer votre matériau xxx

, puis utiliser l'extension pour vérifier s'il est walkable xxx

Ensuite, utilisez-le xxx


0 commentaires

1
votes

Peut-être que vous devriez utiliser une classe avec héritage au lieu de simplement utiliser un énumé. Cela vous permettra de définir toutes sortes de propriétés.

public abstract class Material
{
    public abstract bool Walkable();
}


public class Wood : Material
{
    public bool Walkable()
    {
         return true;
    }
}

public class Lava: Material
{
    public bool Walkable()
    {
         return false;
    }
}


0 commentaires

1
votes

Voulez-vous envisager de remplacer l'énum avec une entité?

Materials.Where(m => m.IsWalkable)


0 commentaires