492 messaggi dal 08 gennaio 2007
Ciao, ho questa enum:

[Flags]
public enum IncludeDays : byte
{

None = 0,
Lunedì = 1,
Martedì = 2,
Mercoledì = 4,
Giovedì = 8,
Venerdì = 16,
Sabato = 32,
Domenica = 64
}

L'ho ornata con il Flags per poter impostare più di un valore, nel form che l'utente deve compilare è presente una CheckBoxList dalla quale estraggo un valore in questo modo:

int CalcolaFlags(CheckBoxList list)
{
int bitvalue = 0;
for (int i = 0; i < list.Items.Count; i++)
{
if (list.Items[i].Selected)
{
bitvalue += (int)Math.Pow(2, i);
}
}
return bitvalue;
}

In questo modo ho un valore intero che contiene la combinazione in base 2 dell'enum. Ora però ho la necessità di estrarre i valori dal valore intero e riempire un vettore di bool, se devo estrarre le stringhe non è un problema:

string giorni = ((IncludeDays)days).ToString();
... e la conversione è automatica, potrei strarre i singoli giorni con un operazione sulla stringa e riempire un vettore di bool facendo dei confronti, ma sono certo che si possa risolvere in modo più efficiente, ma ci sto sbattendo la testa, qualcuno ha qualche idea?
Io farei Enum.GetValues(typeof(IncludeDays)) così hai l'array di possibili valori, poi con un ciclo metti ogni valore in & (logico) con il valore da confrontare. Se il risultato è diverso da 0 il valore da confrontare contiene quell'enum.

Ciao

Il mio blog
Homepage
492 messaggi dal 08 gennaio 2007
Quando si dice 'dimenticare i fondamentali'...

private void EstraiFlag(int p)
    {
        Array a = Enum.GetValues(typeof(IncludeDays));
        IncludeDays[] dddd = new IncludeDays[a.Length];
        for (int j = 0; j < dddd.Length; j++)
            dddd[j] = (IncludeDays)a.GetValue(j);
        for (int i = 0; i < dddd.Length; i++)
            {
               if (((int)(dddd[i] & (IncludeDays)p)) != 0)
                   FaiQualcosa(true);
               else FaiQualcosa(false);
            }
    }

Cerco di eliminare quel ciclo per il cast dall'Array e sarà perfetto; grazie
43 messaggi dal 24 ottobre 2006
giusto perchè io l'ho scoperto di recente, l'attributo flag atributo è in realtà quasi inutile, nel senso che una variabile può conteneri SEMPRE più valori di un'enumerazione(sia se imposti l'attributo che non), l'attributo serve ad esempio quando chiami metodi come ToString e altri per mostrare i valori atomici contenuti nella variabilea anzichè il valore complessivo.
492 messaggi dal 08 gennaio 2007
korkless ha scritto:
giusto perchè io l'ho scoperto di recente, l'attributo flag atributo è in realtà quasi inutile, nel senso che una variabile può conteneri SEMPRE più valori di un'enumerazione(sia se imposti l'attributo che non), l'attributo serve ad esempio quando chiami metodi come ToString e altri per mostrare i valori atomici contenuti nella variabilea anzichè il valore complessivo.


Non è una polemica, ma il pungolo della curiosità:
http://msdn2.microsoft.com/it-it/library/system.flagsattribute(VS.80).aspx

Cito:
In genere, i campi di bit vengono utilizzati per elenchi di elementi che potrebbero essere generati in modo combinato, mentre le costanti enumerate vengono generalmente utilizzate per elenchi di elementi che si escludono mutualmente. Di conseguenza, i campi di bit sono progettati per essere combinati con un'operazione OR bit per bit per generare valori senza nome, mentre le costanti enumerate non sono progettate per tale utilizzo. L'utilizzo dei campi di bit varia nei diversi linguaggi rispetto all'utilizzo delle costanti enumerate.


Speravo ci fosse qualche qualche differenza prestazionale, e che l'attributo facesse sì che l'enum venisse trattata dal compilatore come un campo bit c-like, al di là della curiosità intrinseca dell'argomento, il metodo risolutivo suggerito da Ricciolo mi sembra quello suggerito nelle linee guida; non ne sospettavo l'inutilita
Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.