11
votes

C # Conversion des drapeaux de définition dans une variable de type drapeau de type sur un tableau d'entiers

J'ai proposé ce morceau de code qui convertit les indicateurs définis dans une variable de type drapeau de type et renvoie les indicateurs définis comme entièrement entiers. J'aimerais savoir si c'est la meilleure approche.

Exemple d'énumération: p> xxx pré>

la méthode d'extension convertit les indicateurs définis sur le tableau de Int que j'ai proposé: P>

4
8


3 commentaires

Tous les types Enum sont basés sur int comme type sous-jacent, de sorte que la distribution pourrait échouer.


@Ben - C'est un bon point, et cela affecterait ma solution dans la réponse. La meilleure idée de réaliser cela n'est probablement pas une solution générale, mais une spécifique à appliquer lorsque vous savez quelque chose à propos de l'utilisation de l'énum. Vous pourriez aller à l'état sauvage avec un type de sous-jacent générique, mais je pense que cela serait surchargé dans la plupart des cas.


Ce n'est en effet pas une solution générale et elle n'est spécifique que pour les énumérations avec le type sous-jacent étant System.int32. De plus, toutes les valeurs de l'énumération sont indépendantes, le travail de Steve Mitcham travaille donc, tout en le tenant à la Linq.


3 Réponses :


3
votes

juste jeté à un int, puis imprimez des bits individuels.

int x = (int)o
List<int> flags = new List<int>();
for(int i = 1; i < (1 << 30); i <<= 1)
    if(x & i != 0)
        flags.Add(i);
return flags;


0 commentaires

0
votes

Eh bien, vous pouvez remplacer les étapes 1 à 3 avec un appel à Enum.getvalues ​​ . Puis utilisez l'opérateur Bitwise & pour tester lesquels de ceux-ci sont définis dans votre valeur. Ce sera beaucoup plus rapide que de travailler avec des chaînes.

Cette méthode prendra supporter les indicateurs qui sont plus d'un peu large. Si tous les bits sont indépendants, juste Faites ce qu'Anon a dit .


0 commentaires

13
votes

Pour le garder Linq - comme

[Flags]
public enum Status
{
    None = 0,
    One = 1,
    Two = 2,
    All = One | Two,
}

var flags = Enum.GetValues(typeof(Status))
                .Cast<int>()
                .Where(f=> f & o == f)
                .ToList();


3 commentaires

Devrait être où (f => f & o == f)


@Lukeh: le résultat de F & O n'est pas limité à F et 0 . Considérez par exemple le system.windows.forms.keys Enum.


@Ben: Tu as raison. Et je concède également vos points sur les cases de Enum à ulong . J'ai supprimé mes commentaires trompeurs. (C'était très tard ici quand j'ai posté et je ne pensais évidemment pas droit!)