9
votes

Lorsque vous utilisez le drapeau (ENUM), vous avez une limite de 64. Quelle est l'alternative lorsque vous atteignez la limite?

avec Enum sous .NET Le plus grand nombre que vous pouvez utiliser est Ulong.
Cela signifie un maximum de 64 drapeaux.

Quelle serait l'alternative lorsque vous avez besoin de plus de 64 drapeaux?

EDIT

Désolé, j'ai oublié Pour ajouter cela, une alternative qui fonctionnerait toujours avec Opérations bitwises au moins celle-ci; et et ou .

Utilisation de Josh Einstein Suggestion, je suis venu avec cela, ça a du sens? xxx


3 commentaires

Une refonte? Que de nombreux drapeaux sonnent trop complexes.


Jusqu'à présent, je n'ai que 31 drapeaux, mais je veux juste m'assurer que j'ai un plan de sauvegarde prêt si c'est nécessaire


Yagni vient à l'esprit. Se concentrer sur les problèmes que vous avez.


3 Réponses :


5
votes

Vous pouvez alors passer à l'aide d'un Bitarray . Vous perdrez toutes les "fonctionnalités" d'une énumération telle que la mise en forme de chaîne par défaut et la capacité d'analyse. Un bittharray serait fondamentalement similaire à avoir un groupe de champs booléens, sauf que le stockage est beaucoup plus efficace.

En effet, comme le dit Jeff dans les commentaires avec ce nombre de bits indépendants, il semble que c'est une solution erronée de toute façon. Un bitparray peut être beaucoup plus approprié pour votre scénario particulier.


3 commentaires

Jusqu'à présent, cela semblent être la meilleure alternative, car je ne peux pas vraiment regrouper mon drapeau


Pouvez-vous regarder ma question mise à jour et me dire si c'est ce que vous aviez à l'esprit?


Désolé pour le retard. Vous pouvez utiliser un seul bitarray pour contenir autant de drapeaux que vous le souhaitez. var bits = nouveau bitarray (nouveau Bool [255]); bits.set (50, vrai); bits.get (50); etc ... vous voudriez probablement définir les positions de bits dans un énuméré traditionnel (non drapeaux) qui peut contenir autant de valeurs que son type sous-jacent. En d'autres termes bits.set (myflags.flag50, true);



7
votes

Que de nombreux drapeaux semblent excessifs et suggéreraient une refonte est nécessaire. Cependant, vous pouvez envisager d'utiliser deux ensembles de drapeaux. Le premier à désigner le "groupe de drapeau" et le second pour désigner les drapeaux de ce groupe. Vous devriez avoir une classe qui a ensuite géré votre "Enum groupé" afin que vous puissiez tester si un drapeau a été défini ou non de manière simple.

struct BigFlags<TGroupEnum, TFlagEnum>
{
    private Dictionary<TGroupEnum, TFlagEnum> flags;

    public BigFlags(IDictionary<TGroupEnum, TFlagEnum> flags)
    {
        this.flags = new Dictionary<TGroupEnum, TFlagEnum>(flags);
    }

    public BigFlags(TGroupEnum group, TFlagEnum flags)
    {
        this.flags = new Dictionary<TGroupEnum, TFlagEnum>() { { group, flags } };
    }

    public bool Contains(BigFlags<TGroupEnum, TFlagEnum> flags)
    {
        // TODO: Compare dictionaries and see if the passed flags are a subset of these flags.
    }

    // TODO: Equality to check exact match
    // TODO: Logical operators and operators for setting/removing flags.
}


2 commentaires

Malheureusement, je ne peux pas vraiment les regrouper


@Fredou: Vous risquez peut-être raccrocher la terminologie. "Groupe" n'est qu'un terme que j'ai utilisé, ce que cela est vraiment un moyen d'étendre le nombre de drapeaux que vous pouvez utiliser. Considérez «groupe» pour être la partie haut de gamme de vos drapeaux.



1
votes

Lorsque vous avez besoin de plus de 64 indicateurs, vous pouvez utiliser la version 128-Flags. XXX


0 commentaires