8 votes

Ce type de fonction ou de technique a-t-il un nom ?

Bonjour, je suis un peu novice en programmation, plutôt un hobby. Je me demande si la logique ou la technique suivante a un nom ou un terme spécifique. Mon projet actuel comporte 7 cases à cocher, une pour chaque jour de la semaine. J'avais besoin d'un moyen facile de sauvegarder les cases cochées.

La méthode suivante permet de sauvegarder les cases cochées en un seul nombre. Chaque case cochée reçoit une valeur qui est le double de la dernière case cochée. Lorsque je veux savoir quelles cases sont cochées, je travaille à rebours et je vois combien de fois je peux diviser la valeur totale par la valeur de la case à cocher.

private int SetSelectedDays()
{
     int selectedDays = 0;
     selectedDays += (dayMon.Checked) ? 1 : 0;
     selectedDays += (dayTue.Checked) ? 2 : 0;
     selectedDays += (dayWed.Checked) ? 4 : 0;
     selectedDays += (dayThu.Checked) ? 8 : 0;
     selectedDays += (dayFri.Checked) ? 16 : 0;
     selectedDays += (daySat.Checked) ? 32 : 0;
     selectedDays += (daySun.Checked) ? 64 : 0;
     return selectedDays;
}

private void SelectedDays(int n)
{
     if ((n / 64 >= 1) & !(n / 64 >= 2))
     {
          n -= 64;
          daySun.Checked = true;
     }
     if ((n / 32 >= 1) & !(n / 32 >= 2))
     {
          n -= 32;
          daySat.Checked = true;
     }
     if ((n / 16 >= 1) & !(n / 16 >= 2))
     {
          n -= 16;
          dayFri.Checked = true;
     }
     if ((n / 8 >= 1) & !(n / 8 >= 2))
     {
          n -= 8;
          dayThu.Checked = true;
     }
     if ((n / 4 >= 1) & !(n / 4 >= 2))
     {
          n -= 4;
          dayWed.Checked = true;
     }
     if ((n / 2 >= 1) & !(n / 2 >= 2))
     {
          n -= 2;
          dayTue.Checked = true;
     }
     if ((n / 1 >= 1) & !(n / 1 >= 2))
     {
          n -= 1;
          dayMon.Checked = true;
     }
     if (n > 0)
     {
          //log event
     }
}

Cette méthode fonctionne bien pour ce dont j'ai besoin, mais si vous voyez une autre façon de faire, ou une meilleure façon d'écrire, je serais intéressé par vos suggestions.

6voto

ChaosPandion Points 37025

Quelqu'un d'autre a mentionné le masquage de bits, mais j'ai pensé vous montrer un moyen de simplifier votre code.

daySun.Checked = (n & 64) == 64;
daySat.Checked = (n & 32) == 32;
dayFri.Checked = (n & 16) == 16;
dayThu.Checked = (n & 8) == 8;
dayWed.Checked = (n & 4) == 4;
dayTue.Checked = (n & 2) == 2;
dayMon.Checked = (n & 1) == 1;

4voto

Andy Shellam Points 8120

Cela ressemble au masquage de bits. Lorsque je retrouverai le blog que j'ai lu cette semaine et qui utilise cet exemple précis, je le publierai !

Ah, j'ai compris ! Le voici .

Vous pouvez alors faire des choses comme :

DaysOfWeek week = DaysOfWeek.Sunday | DaysOfWeek.Monday;

pour sélectionner le dimanche et le lundi. Ou, dans votre exemple, lorsque vous vérifiez la valeur de chaque case à cocher, vous pouvez faire :

DaysOfWeek week = DaysOfWeek.None; // DaysOfWeek.None = 0

if (Monday.Checked)
{
    week |= DaysOfWeek.Monday;
}

et de vérifier si un jour particulier est fixé :

DaysOfWeek week = DaysOfWeek.Monday | DaysOfWeek.Tuesday;

// this will be FALSE (so Wednesday will remain unchecked) because "week" contains Monday/Tuesday, but not Wednesday.
if ((week & DaysOfWeek.Wednesday) == DaysOfWeek.Wednesday)
{
    Wednesday.Checked = true;
}

EDIT :

La fonction DayOfWeek intégrée à .NET ne permet pas de masquer des valeurs multiples, vous devrez donc créer votre propre fonction. DaysOfWeek enum.

3voto

Peter Points 9636

Vous pourriez créer une liste de tous les jours et la marquer avec l'attribut [Flags], puis donner à chaque jour la même valeur que votre (bla.checked) ? XX..

vous pourriez alors utiliser +=, and, or pour obtenir la même fonctionnalité

Ainsi, pour vérifier si une valeur contient, par exemple, lundi, il faut procéder comme suit

if (myEnum & Days.Monday == Days.Monday) { ... }

1voto

Lee Points 6659

C'est ce qu'on appelle le masquage de bits et vous pouvez faire la même chose plus facilement en utilisant une fonction Enum avec l'attribut Flags .

1voto

Kilian Foth Points 8619

C'est ce qu'on appelle un champ de bits, et oui, c'est la façon la plus efficace de résoudre ce problème. L'utilisation de booléens séparés nécessitera probablement plus de mémoire, mais l'amélioration de la lisibilité vaut bien six octets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X