In vb.net o C# Mi aspetterei che l'approccio generale più veloce per confrontare un variabile rispetto a qualsiasi numero ragionevole di oggetti con nome separato (al contrario, ad esempio, di tutte le cose in una collezione) sarà semplicemente confrontare ogni oggetto con il confronto e molto come hai fatto. È certamente possibile creare un'istanza di una raccolta e vedere se contiene l'oggetto, e farlo potrebbe essere più espressivo che comparare l'oggetto con tutti gli oggetti individualmente, ma a meno che non si usi un costrutto che il compilatore può riconoscere esplicitamente, tale codice quasi certamente sarà molto più lento del semplice fare i confronti individuali. Non mi preoccuperei della velocità se il codice per sua natura funzionasse al massimo poche centinaia di volte al secondo, ma sarei diffidare dal fatto che il codice venga riproposto a qualcosa che viene eseguito molto più spesso di quanto inizialmente previsto.
Un approccio alternativo, se una variabile è qualcosa come un tipo di enumerazione, consiste nel scegliere valori di enumerazione power-of-two per consentire l'uso di maschere di bit. Se il tipo di enumerazione ha 32 o meno valori validi (ad esempio, iniziando Harry = 1, Ron = 2, Hermione = 4, Ginny = 8, Neville = 16) uno potrebbe memorizzarli in un numero intero e controllare più bit contemporaneamente in un singolo operazione ((if ((thisOne & (Harry | Ron | Neville | Beatrix))! = 0)/* Esegui qualcosa * /. Ciò consentirà un codice veloce, ma limitato alle enumerazioni con un numero limitato di valori.
Un approccio un po 'più potente, ma che deve essere usato con cautela, consiste nell'usare alcuni bit del valore per indicare gli attributi di qualcosa, mentre altri bit identificano l'elemento. Ad esempio, il bit 30 potrebbe indicare che un personaggio è maschio il bit 29 potrebbe indicare un amico di Harry ecc., mentre i bit più bassi distinguono tra i personaggi: questo approccio consentirebbe di aggiungere personaggi che potrebbero o meno essere amici di Harry, senza richiedere il codice che controlla per amico di Harry per cambiare. Un avvertimento è che bisogna fare una distinzione tra le costanti di enumerazione utilizzate per impostare un valore di enumerazione e quelle utilizzate per testarlo. Ad esempio, per impostare una variabile per indicare Harry, si potrebbe desiderare di impostarla su 0x60000001, ma per vedere se una variabile è Harry, si dovrebbe testare il bit con 0x00000001.
Un altro approccio, che può essere utile se il numero totale di valori possibili è moderato (ad esempio 16-16.000 o giù di lì) deve avere una matrice di flag associata a ciascun valore.Si potrebbe quindi codificare qualcosa come "if (((characterAttributes [theCharacter] & chracterAttribute.Male)! = 0)". Questo approccio funzionerà al meglio quando il numero di caratteri è piuttosto ridotto Se l'array è troppo grande, i messaggi di cache potrebbero rallentare giù il codice al punto che il test contro un piccolo numero di caratteri singolarmente sarebbe più veloce.
Più facile è una preferenza personale. Personalmente, non penso che sia più semplice di 'value == 1 || valore == 2'. –
@Joel: È facile, ma non intuitivo per qualcuno che è solito dire "Voglio che sia 1 o 2". A quanto pare, ci sono stati linguaggi che implementano precisamente questa sintassi; FOCUS query IBI lanaguage, per uno. –
@Steven Sudit - "Intuitivo" in questo contesto si riduce alle preferenze personali. –