2012-01-21 11 views
6

Mam funkcji z wieloma jeśli'S (nie jest to rzeczywisty kod)C#: Expression

if(n == 1) 
    m = 1; 
if(n == 2) 
    m = 2; 
if(n == 3) 
    m = 3; 

Zamiast tego chciałem zrobić uczynić je wszystkie do: Wyrażenie:

(n == 1) ? m = 1; 

Ale mówi, że spodziewa się jego „:”

jestem zaznajomiony z: ekspresja od C++, gdzie można po prostu napisać:

(n == 1) ? m = 1 : 0; 

Ale 0 nie bierze tutaj. To jest absurdalne pytanie i nie mogłem znaleźć odpowiedzi w google, ponieważ ignoruje "?:" Jako słowo.

ODPOWIEDŹ: szkoda, odpowiedź była w komentarzach. W tym wyrażeniu nie ma sposobu, aby "nic nie robić" i powinienem użyć if-else lub switch. dzięki.

+5

Dlaczego nie 'm = n'? – Pubby

+0

Tak, Google nie może mieć znaku zapytania. Nazywa się to operatorem trójskładnikowym. – DOK

+8

Instrukcja "if" * wykonuje instrukcję, jeśli warunek jest spełniony *. Wyrażenie warunkowe * wybiera wyrażenie do oceny, czy warunek jest spełniony *, aw C# it * musi coś zrobić z tym wyrażeniem *. (W przeciwieństwie do C++, gdzie wyrażenie może być wykonane ze względu na efekty uboczne.) Miksujesz oba style w dziwny sposób; nie rób tego. Zwykle jest to niemożliwe, a kiedy jest to możliwe, jest bardzo mylące. Użyj przełącznika lub if-else; to jest o wiele bardziej czytelne. –

Odpowiedz

2

poszukuje Ternary operatora w C# daje odpowiednie wyniki.

Wykorzystanie Przykładem może być

var m = n == 1 ? 1 : 0 
+2

Operator warunkowy '?:' Jest operatorem potrójnym, ponieważ wymaga trzech parametrów. Nie nazwałbym tego * potrójnym operatorem, nawet jeśli C# ma obecnie tylko jedną z nich. – CodesInChaos

+1

Myślę, że to powinien być komentarz. – CodesInChaos

+0

Proponuję * trójskładnikowego operatora warunkowego *. – Pubby

14

Wygląda na to, czego szukasz:

m = (n == 1) ? 1 : 0; 

które można następnie kaskada do:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0; 

Ważnym (dla mnie, w każdym razie), na bok:

Dlaczego o to pytasz? Jeśli dzieje się tak dlatego, że uważasz, że ten formularz będzie bardziej wydajny niż seria instrukcji if, lub nie będzie to switch, , . Kompilator C# i kompilator JIT .NET są naprawdę sprytne i przekształcą Twój kod (miejmy nadzieję!) W jego najbardziej optymalną formę. Wpisz swój kod, aby był zrozumiały dla siebie lub programisty, który musi go utrzymywać po, jak to tylko możliwe. Jeśli uzyskana wydajność jest niedopuszczalna, spróbuj ją zmienić, ale zmień wartość , aby określić, która metoda działa najlepiej (mając na uwadze to, że nowsze kompilatory/frameworki .net mogą zmienić to, co się dzieje).

+0

Wow, nie zdawałem sobie sprawy, że możesz połączyć je razem. – DOK

+7

@DOK - możesz, nie znaczy to, że robi coś innego niż strasznie nieczytelny kod! ; =) – Rob

+0

@Rob [To nie musi być] (http://pastebin.com/0kHXD1Hd). Nie jestem pewien, czy C# ma '# define', ale to robię w C/C++. – Pubby

1

można napisać:

m = (n==1) ? 1 : m; 

Ale IMO to trudniejsze do odczytania i brzydsze niż w oryginalnym kodzie.

(n == 1) ? m = 1 : 0; 

Jest to niedozwolone, ponieważ C# nie dopuszcza wyrażeń arbitralnych jako instrukcji. Wywołania metod i przypisania są dozwolone, większość innych wyrażeń nie jest.

Instrukcja jest wykonywana ze względu na swoje efekty uboczne, wyrażenia dla jej wartości. Naturalne jest zatem, że zewnętrzna część instrukcji ma efekt uboczny. ?: nigdy nie ma efektu ubocznego, więc nie jest dozwolone jako wypowiedź.

1

Chcesz to:

m = (n == 1) ? 1 : 0;

Aby zagnieździć im wszystko będzie wyglądać następująco:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : 0;

Ale jak widać, jest to naprawdę dużo trudniej Przeczytaj i zrozum. Może pomóc dodać dodatkowe nawiasy, ale myślę, że lepiej jest użyć drzewa if-else.

1
m = (n == 1) ? 1 : m 

Środki

m oznacza 1 gdy n == 1, inaczej m

FYI ? nazywa operator Ternery. Znajdź Składnia on MSDN

poważaniem

0

Spróbuj tego:

m = (n == 1) ? 1 : 0; 
2

Może:

m = (n == 1) ? 1 : (n == 2) ? 2 : (n == 3) ? 3 : m; 

lub

m = n 

Ed to: uproszczonej:

variable2 = (variable1 == value) ? 
      variable1 : 
      variable2; 
+0

+1 dla 'm = n'. Zoptymalizowany kod; P –

+0

Poważnie? To jest przykład: – user779444

+0

@ user779444 Nie jest to naprawdę dobry przykład. I bardzo łatwo jest zrozumieć, jak to zrobić z mojej odpowiedzi. –

0

To nie jest problem, który należy rozwiązać z potrójnego jeśli/operator inny - jest wyraźnie idealnym kandydatem do instrukcji switch (i za pomocą przełącznika jest prawdopodobnie znacznie więcej wydajny niż przy użyciu sekwencji operatorów trójskładnikowych)

Jeśli chcesz transliterować instrukcji if do:?, to jest całkiem prosta:

if ({condition}) {then-code}; else {else-code}; 

staje

{condition} ? {then-code} : {else-code}; 

Jedynym ograniczeniem jest to, że kod then/else jest pojedynczą instrukcją.

Podstawową zaletą?: (W przypadku współczesnych kompilatorów) jest to, że można je osadzić w oświadczeniu, aby znacząco skompresować kod źródłowy - czasami może to ułatwić czytelność, a czasami służy tylko zaciemnianiu znaczenia kodu - używaj go ostrożnie.