2009-11-04 8 views
7

miałem tylko pomysł ostatni nigth pisząc if-wyrażenie a czasami ekspresji wydają się być długa, gdy masz go tak:C# w operatora przeciążenia

if(x == 1 || x == 2 || x == 33 || x == 4 || x == -5 || x == 61) { ... } 

x może być teksty stałe, ciągi , ints, chars masz zdjęcie.

Chcę wiedzieć, czy jest łatwiejszy sposób napisania tego. myślę SQL operator „w” na przykład jako eay skrócić wyrażenie:

if(x in (1,2,33,4,-5,61)) { ... } 

wiem, że nie można napisać wyrażenie takiego z „w” bo lexer i analizatora z wonów kompilatora rozpoznają to.

Być może inne rozwiązania, takie jak metody rozszerzenia różnych typów x, są rozwiązaniem? W nadchodzącym .NET 4.0 słyszałem coś o sparametryzowanych metodach, czy powinno to rozwiązać liczbę parametrów dostarczonych do wyrażenia if?

Być może rozumiesz mnie, masz pojęcie o dobrej praktyce/rozwiązaniu tego pytania?

/Daniel

+0

znajdę tytuł nieco mylące. Wygląda na to, że chcesz użyć C# w przeciążeniu operatora. Włożyłem IN w czapki z braku lepszego pomysłu, jak uczynić to bardziej jasnym. –

+0

ciekawe pytanie jednak –

Odpowiedz

13

Spróbuj następującą

if ((new []{1,2,33,4,-5,61}).Any(i => x == i)) { 
    ... 
} 
+0

To całkiem stylowe. –

+3

Z wnioskiem o typ można nawet pominąć 'int' (myślę). – Svish

+0

@Svish, nie zdawałem sobie sprawy, że to możliwe, ale zweryfikowano, że działa z Beta2 2010. Zaktualizowana odpowiedź: – JaredPar

0
string[] possible = new string[3] { 1, 2, 3); 

    if (possible.Contains(x)) { ... 
+0

Myślę, że chciałeś int, a nie ciąg tam. – JaredPar

+0

Myślę, że pytanie było przeznaczone dla wszystkich typów. –

+1

Hmm .. Wymagana jest większa ilość kawy. – Paddy

0
bool In<T>(T num, params int args) 
    { 
     return (new List<T>(args)).Contains(num); 
    } 
+1

Dlaczego stosuje się ogólną metodę, która pobiera tylko listę elementów int? Rozważ użycie parametrów T [] zamiast argumentów - które możesz następnie wywołać. Zawiera bezpośrednio. –

1
public static bool In<T>(this T X, params T[] list) 
    { 
     foreach (var item in list) 
     { 
      if (X.Equals(item)) 
       return true; 
     } 
     return false; 
    } 
+0

co powiesz na 'return list.Contains (x);'? –

+0

array nie zawiera metody Contains –

+0

Array implementuje 'IEnumerable ', która ma metodę rozszerzenia Contains w System.Linq – Lee

0

Biorąc pod uwagę, że x jest int można napisać metodę rozszerzenia tak:

public static bool In(this int i, params int[] values){ 
    foreach(int v in values) { 
     if (i == v) { 
      return true; 
     } 
    } 
    return false; 
} 
18

zwykle napisać Extension Method następująco:

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

które mogą być używane tak:

if(x.In(1,6,9,11)) 
{ 
     // do something.... 
} 
+1

Podoba mi się ta, ponieważ jest generyczna i używa metody Contains, a nie operatora ==. –

+0

Nie mogę tego poprawić ... To wydaje się bardziej naturalne. Dodałem także przeciążenie: public static bool W (to źródło T, IEnumerable lista) z tym samym ciele. – Crisfole