2011-02-04 19 views
20

.NET supporta ora il null coalescing operatorchiamata singolo operatore ternario

var item = aVal ?? aDefaultVal; 

potrei affaccia su qualcosa di ovvio, ma c'è qualcosa di simile per l'operatore ternario, in modo tale che invece di fare

var item = aclass.amethod() > 5 ? aclass.amethod() : 5; 

esso wouldn essere necessario chiamare lo amethod() due volte?

+7

Intendi l'operatore * ternario *? :) – Mehrdad

+1

Proprio per questo, quell'operatore è un operatore * coalesce *. Molto simile al 'COALESCE()' che vediamo in SQL. –

+0

moo, è corretto, c'è una funzione .net simile per la coalesce? e preferibilmente una versione scorciatoia? –

risposta

12

Non esiste un operatore di questo tipo incorporato in C#.

Mentre avrei selezionare una delle altre risposte (quella che usa Math.Max è senza dubbio più chiaro per l'esempio postato), questo è qui solo per mostrare un altro metodo. È un peccato che il calcolo richieda una variabile tipizzata esplicitamente.

Func<int,int> computation = (x) => x > 5 ? x : 5; 
var item = computation(aclass.amethod()); 

E in linea, che è solo brutto in C#.

var item = ((Func<int,int>)((x) => x > 5 ? x : 5))(aclass.amethod()); 

Naturalmente sia di quanto sopra bollire veramente basso per solo:

var item = DoComputation(aclass.amethod()); 

e utilizzare il fatto che C# non fa uso di pass-by-name :-)

O, forse un metodo di estensione:

static class Ext { 
    public static TO Apply<TI,TO> (this TI obj, Func<TI,TO> fn) { 
    return fn(obj); 
    } 
} 

// note C# now lets us get away with no explicit Func<...> type 
var item = Ext.Apply(aclass.amethod(), x => x > 5 ? x : 5); 

// or as extension method -- imagine computation is as it was in the 
// first example, or a compatible method group 
var item = aclass.amethod().Apply(computation); 

Felice codifica.

+0

il percorso del metodo di estensione è il più vicino a una soluzione.Grazie –

+0

@boomhauer Abbi cura di "essere troppo ingannevole". È facile impazzire con i metodi di estensione - ma alla fine della giornata, C# è C# (e non F # o Scala o lingua-X ;-) –

+0

Sono completamente d'accordo, ma mi sono stancato di creare vars temporanei su tutto il posto per aggirare questo;) –

26

ne dite:

var result = aclass.amethod(); 
var item = result > 5 ? result : 5; 

Hai solo bisogno di chiamare aclass.amethod() una volta, allora.

+0

+1 per aver chiamato il metodo solo una volta – JYelton

+0

e +1 per quello che avrebbe dovuto essere ovvio – NotMe

+2

ragazzi, si sta chiedendo se c'è un singolo modo di chiamare per farlo. ovviamente puoi definire una variabile var. –

28
var item = Math.Max(5, aclass.amethod()); 
+1

+1 per la gestione concisa di questo esempio – JYelton

+1

+1 per un approccio molto interessante. – NotMe

+0

Grazie, @Chris. –