2009-11-04 8 views
7

ich nur eine Idee letzte nigth hatte, als einen if-Ausdruck schreiben und manchmal den Ausdruck neigen dazu, lang zu sein, wenn Sie es so haben:C# in betreiber Überlastung

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

x Aufzählungen sein kann, Streicher , ints, chars du bekommst das Bild.

Ich möchte wissen, ob es eine einfachere Möglichkeit gibt, dies zu schreiben. Ich denke an Bediener sql ‚in‘ beispielsweise als eay den Ausdruck zu verkürzen:

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

Ich weiß, dass Sie nicht einen Ausdruck wie dies mit ‚in‘, weil der Lexer und Parser des Compilers gewonnen schreiben Erkenne es nicht.

Vielleicht sind andere Lösungen als Erweiterung Methoden der verschiedenen Arten von x die Lösung? In der kommenden .NET 4.0 hörte ich etwas über parametrisierte Methoden, sollte das die Anzahl der Parameter lösen, die an den if-Ausdruck geliefert werden?

Vielleicht verstehen Sie mich, haben Sie eine Idee von einer guten Praxis/Lösung für diese Frage?

/Daniel

+0

ich den Titel ein wenig verwirrend finden. Es scheint so, als ob Sie C# in einer Überlastung des Operators verwenden möchten. Ich setze den IN in Kappen, weil ich keine bessere Vorstellung davon habe, wie man das deutlicher machen könnte. –

+0

interessante Frage obwohl –

Antwort

13

Versuchen Sie, die folgenden

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

Das ist ziemlich stilvoll. –

+3

Mit Typ-Inferenz können Sie sogar das 'int' überspringen (denke ich). – Svish

+0

@Swish, wusste nicht, dass das möglich war, aber verifiziert, es funktioniert mit 2010 Beta2. Aktualisierte Antwort – JaredPar

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

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

Ich glaube, du wolltest Int und String nicht. – JaredPar

+0

Ich denke, die Frage war für alle Typen gedacht. –

+1

Hmm .. Mehr Kaffee benötigt. – Paddy

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

Warum eine generische Methode, die nur eine Liste von Ints braucht? Ziehen Sie stattdessen params T [] Argumente in Betracht, die Sie dann direkt aufrufen können. –

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

Wie sieht es mit 'return list.Contains (x);'? –

+0

Array enthält keine Contains-Methode –

+0

Array implementiert 'IEnumerable ', die eine Contains-Erweiterungsmethode in System.Linq enthält – Lee

0

Da x eine int Sie eine Erweiterungsmethode wie so schreiben könnte:

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

Ich schreibe in der Regel eine Extension Method wie folgt:

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

, die wie folgt verwendet werden kann:

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

Ich mag dies, weil es generisch ist und die Contains-Methode anstelle des Operators == verwendet. –

+0

Ich kann diesen Daumen nicht hochhalten ... Es fühlt sich so viel natürlicher an. Ich fügte auch eine Überladung hinzu: öffentlichen statischen bool In (diese T-Quelle, IEnumerable Liste) mit dem gleichen Körper. – Crisfole