Najbardziej zwięzły sposób określenia, czy zmienna jest równa wartości z "listy" wartości


9

Jeśli mam zmienną w języku C#, która musi zostać sprawdzona w celu ustalenia, czy jest ona równa jednemu ze zbioru zmiennych, jaka jest najlepszy sposób to zrobić?

Nie szukam rozwiązania, które przechowuje zestaw w tablicy. Jestem bardziej ciekawy, czy istnieje rozwiązanie, które w jakiś sposób wykorzystuje logikę boolowską, aby uzyskać odpowiedź.

Wiem, że mógłbym zrobić coś takiego:

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

Jestem ciekaw, czy mogę zrobić coś więcej tak:

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

Oczywiście powyższe nie będzie działać, ale chciałbym zobaczyć, czy istnieje coś bardziej zwięzłego niż mój pierwszy przykład, który musi powtarzać tę samą zmienną w kółko dla każdej wartości testowej.

UPDATE:
postanowiłem przyjąć odpowiedź CoreyN jako wydaje się najprostszym podejściem. Jest to praktyczne i nadal łatwe do zrozumienia dla początkujących.

Niestety tam, gdzie pracuję, nasz system korzysta z platformy .NET 2.0 i nie ma szans na szybką aktualizację w najbliższym czasie. Czy są jakieś inne rozwiązania tam, że nie opierają się na .NET 3.5 ram, oprócz najbardziej oczywistego mogę myśleć:

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

Oto .NET 2.0 rozwiązanie, nieco bardziej złożone niż Corey: http://stackoverflow.com/questions/18407#153037 30 wrz. 082008-09-30 13:38:51

  0

Przykład kodu JavaScript http://stackoverflow.com/questions/12116326 21 sty. 152015-01-21 21:23:45

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

0

Zwykle używam CoreyN „s solution dla prostych przypadkach, takich jak że. Coś bardziej złożonego, użyj zapytania LINQ.


-1

Ponieważ nie określiłeś rodzaju danych, które masz jako dane wejściowe, zakładam, że możesz podzielić swoje wejście na moc 2 -> 2,4,8,16 ... To pozwoli ci użyć bity, aby określić, czy wartość testowa jest jednym z bitów wejściowych.

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

stosując pewne binarny matematyki ...

testList = 4 + 16 + 64 => 1010100
testValue = 16
testResult = testList & testWartość


1

Możesz zrobić coś podobnego z .NET 2.0, korzystając z faktu, że tablica o f T implementuje IList <T>, a IList <T> ma metodę Contains. Dlatego po to odpowiednik .NET 3.5 roztworze Coreya, choć oczywiście mniej oczywiste:

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

często używam IList <T> dla deklaracji tablicy lub przynajmniej na przejściu jednowymiarowe argumenty tablicowe. Oznacza to, że możesz używać właściwości IList, takich jak Count, i łatwo przełączać się z tablicy na listę. Na przykład.

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