2009-11-04 16 views
7

Ho appena avuto un'idea ultimo nigth quando si scrive un'espressione se- e, talvolta, l'espressione tendono ad essere a lungo quando si ha in questo modo:C# a operatore sovraccarico

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

x può essere enumerazioni, stringhe , ints, chars ottieni l'immagine.

Voglio sapere se ci sono un modo più semplice di scrivere questo. Penso dell'operatore di SQL 'in' per esempio come eay per accorciare l'espressione:

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

so che non si può scrivere un'espressione come questa, con 'in' perché il lexer e parser del won compilatore lo riconosco

Forse altre soluzioni come metodi di estensione di diversi tipi di x è la soluzione? Nel prossimo NET 4.0 Ho sentito qualcosa sui metodi con parametri, che dovrebbe risolvere la quantità di parametri n dotazione alla se-espressione?

Forse mi capisci, hai un'idea di una buona pratica/soluzione a questo problema?

/Daniel

+0

trovo il titolo un po 'di confusione. Sembra che tu voglia usare C# in un sovraccarico dell'operatore. Ho messo l'IN in maiuscolo per mancanza di un'idea migliore su come renderlo più chiaro. –

+0

domanda interessante anche se –

risposta

13

Provate il seguente

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

Questo è abbastanza elegante. –

+3

Con l'inferenza del tipo si può anche saltare il 'int' (penso). – Svish

+0

@Svish, non ha capito che era possibile ma ha verificato che funziona con Beta2 2010. Aggiornato risposta – JaredPar

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

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

Penso che tu volessi int e non stringa lì. – JaredPar

+0

Penso che la domanda fosse rivolta a tutti i tipi. –

+1

Hmm .. Più caffè richiesto. – Paddy

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

Perché un metodo generico, che richiede solo un elenco di ints? Prendi in considerazione l'utilizzo dei parametri T [] args - che puoi quindi chiamare .Contains direttamente. –

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

per quanto riguarda 'return list.Contains (x);'? –

+0

array non ha il metodo Contains –

+0

Array implementa 'IEnumerable ' che ha un metodo di estensione Contiene in System.Linq – Lee

0

Dato che x è un int si potrebbe scrivere un metodo di estensione in questo modo:

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

solito scrivo un Extension Method come segue:

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

che può essere utilizzato in questo modo:

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

Mi piace questo perché è generico e utilizza il metodo Contiene piuttosto che l'operatore ==. –

+0

Non riesco a rivelarlo abbastanza ... Mi sembra molto più naturale. Ho anche aggiunto un sovraccarico: bool public static In (questa fonte T, IEnumerable lista) con lo stesso corpo. – Crisfole