2012-03-07 15 views
5

Czy jest skrótem składni w C#, aby ta:testu dla wielu wartości w instrukcji if w C#

if ((x == 1) || (x==2) || (x==5) || (x==13) || (x==14)) 

... krótszy? Coś jak (hipotetycznie)

if (x in {1, 2, 5, 13, 14}) 

Ja "czuję" jakby istniał, po prostu tracę mentalnie i Googly. W rzeczywistości muszę przetestować kilka wyliczeń często i jest to po prostu nieczytelne. Nienawidzę też tworzyć małej funkcji pomocniczej, jeśli język już ją obsługuje.

Z góry dziękuję!

Edit

Są sprytne rozwiązania obejmujące list ... ale miałem nadzieję na czystej logicznej konstrukcji pewnego rodzaju. Jeśli nie istnieje, niech tak będzie. Dzięki!

+0

http://stackoverflow.com/questions/3907299/c-sharp-if-statements-matching-multiple-values ​​ –

+0

Nie jest konieczne stosowanie wewnętrzne cytaty: 'if (x == 1 || x == 2 || x == 5 ...) 'z wyjątkiem sytuacji, gdy kilka lat użyłeś Pascal/Delphi i ma" profesjonalne zniekształcenie ". – i486

Odpowiedz

12

Spróbuj tego:

if ((new[]{1, 2, 5, 13, 14}).Contains(x)) ... 
+0

pokonałeś mnie. –

+0

Tak ... Przypuszczam, że byłoby to nieco czystsze niż to, co mam. W przypadku braku super-prostej składni, używam tylko funkcji pomocniczej, takiej jak 3907299, którą opublikował "Jeremy D". Dzięki i tak. – Adamlive

+0

'HashSet ' byłby szybszy niż 'Array'! =) –

0

Nie, nie ma wsparcia dla porównując bezpośrednio tak. Jednak można użyć metod LINQ, takich jak Contains(). Mogę podać przykład, ale to zależy od tego, jak przechowywane są dane.

2

Choć myślę, że jeśli oświadczenie jest w porządku, a co kod krótki ze względu na breifness jest bezużyteczny, tu idzie:

pierwsze podejście, zakładając, że chcą iść drogą LINQ:

if ((new[]{1,2,5,13,14}).Contains(x)){ 
} 

drugie podejście, ArrayList

if ((new System.Collections.ArrayList(new[]{1,2,5,13,14})).Contains(x)){ 
} 

trzecie podejście, List:

if ((new System.Collections.Generic.List<Int32>(new[]{1,2,5,13,14})).Contains(x)){ 
} 

Należy jednak pamiętać, że wszystkie te dodać więcej narzutów (i naprawdę nie dodają wiele w zakresie czytelności, biorąc pod uwagę wydajność).

oh i working example of the above.

+0

Dobra uwaga na temat kosztów ogólnych. To będzie działać znacznie częściej, niż muszę to przeczytać. – Adamlive

0

Można chyba zrobić coś takiego:

if(Array.LastIndexOf(new int[]{1, 2,3,4}, x) != -1) 
{ 
    //YOUR CODE HERE 
} 

nie testowano, ale wierzę, że to będzie działać.

edycja Wygląda na to, że podobna odpowiedź została już opublikowana.

2

Chciałbym polecić użycie HashSet(T) Class, aby sprawdzić, czy element należy do zestawu elementów.

Ponadto, jak HashSet<T> asocjacyjny jest pojemnik, jego odnośników złożoność O (1), to stała czasowa: HashSet(Of T).Contains Method, a Array i List<T> ma liniowy czas wyszukiwania: O (n). Tak więc, HashSet<T> będzie lepiej dla wyszukiwania.

HashSet<int> numbers = new HashSet<int> { 1, 2, 5, 13, 14 }; 
int x = 1; 
if (numbers.Contains(x)) 
{ 
    Console.WriteLine("Contains!"); 
} 
Powiązane problemy