Il modo più conciso per determinare se una variabile equivale a un valore da un "elenco" di valori

StackOverflow https://stackoverflow.com/questions/18407

  •  09-06-2019
  •  | 
  •  

Domanda

Se ho una variabile in C# che deve essere controllata per determinare se è uguale a una di un insieme di variabili, qual è il modo migliore per farlo?

Non sto cercando una soluzione che memorizzi il set in un array.Sono più curioso di vedere se esiste una soluzione che utilizzi in qualche modo la logica booleana per ottenere la risposta.

So che potrei fare qualcosa del genere:

int baseCase = 5;
bool testResult = baseCase == 3 || baseCase == 7 || baseCase == 12 || baseCase == 5;

Sono curioso di vedere se posso fare qualcosa di più simile a questo:

int baseCase = 5;
bool testResult = baseCase == (3 | 7 | 12 | 5);

Ovviamente quanto sopra non funzionerà, ma sono interessato a vedere se c'è qualcosa di più conciso del mio primo esempio, che deve ripetere la stessa variabile più e più volte per ogni valore di test.

AGGIORNAMENTO:
Ho deciso di accettare la risposta di CoreyN poiché sembra l'approccio più semplice.È pratico e ancora semplice da capire per un principiante, credo.

Sfortunatamente, dove lavoro, il nostro sistema utilizza il framework .NET 2.0 e non c'è alcuna possibilità di aggiornamento a breve.Esistono altre soluzioni là fuori che non si basano sul framework .NET 3.5, oltre a quella più ovvia a cui riesco a pensare:

new List<int>(new int[] { 3, 6, 7, 1 }).Contains(5);
È stato utile?

Soluzione

        bool b = new int[] { 3,7,12,5 }.Contains(5);

Altri suggerimenti

È possibile fare qualcosa di simile con .NET 2.0, sfruttando il fatto che una matrice di T implementa IList<T> e IList<T> ha un metodo contiene.Pertanto quanto segue è equivalente alla soluzione .NET 3.5 di Corey, anche se ovviamente meno chiara:

bool b = ((IList<int>)new int[] { 3, 7, 12, 5 }).Contains(5); 

Utilizzo spesso IList<T> per dichiarazioni di array o almeno per passare argomenti di array unidimensionali.Significa che puoi utilizzare le proprietà IList come Count e passare facilmente da un array a un elenco.Per esempio.

private readonly IList<int> someIntegers = new int[] { 1,2,3,4,5 };

Di solito uso Corey N'S soluzione per casi semplici come questo.Per qualcosa di più complesso, utilizzare una query LINQ.

Dato che non hai specificato il tipo di dati che hai come input, suppongo che tu possa suddividere il tuo input in potenze di 2 -> 2,4,8,16...Ciò ti consentirà di utilizzare i bit per determinare se il valore del test è uno dei bit nell'input.

4 => 0000100
16 => 0010000
64 => 1000000

usando un po' di matematica binaria...

listatest = 4 + 16 + 64 => 1010100
valoretest = 16
risultatotest = elencotest e valoretest

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top