2011-12-15 6 views
11

In Python posso scrivereTuple e decompressione dell'assegnazione del supporto in C#?

def myMethod(): 
    #some work to find the row and col 
    return (row, col) 

row, col = myMethod() 
mylist[row][col] # do work on this element 

Ma in C# mi ritrovo a scrivere fuori

int[] MyMethod() 
{ 
    // some work to find row and col 
    return new int[] { row, col } 
} 

int[] coords = MyMethod(); 
mylist[coords[0]][coords[1]] //do work on this element 

Il modo Pythonic è obivously molto più pulito. C'è un modo per farlo in C#?

+1

Probabilmente userei i parametri per questo .. –

+1

@MikeChristensen: Le linee guida di progettazione del framework raccomandano di escludere i parametri se possono essere evitati. – dtb

+1

@MikeChristensen Ho pensato ai parametri, ma mi fanno sentire sporco per qualche motivo –

risposta

14

C'è un insieme di Tuple classi in .NET:

Tuple<int, int> MyMethod() 
{ 
    // some work to find row and col 
    return Tuple.Create(row, col); 
} 

Ma non c'è sintassi compatta per estrarli come in Python:

Tuple<int, int> coords = MyMethod(); 
mylist[coords.Item1][coords.Item2] //do work on this element 
+2

Nota per il lettore causale: 'Tuple <...>' è standard solo in .NET4 +. –

+0

Nota per altri lettori, è possibile creare una tupla da 2 in .NET <4 (in sostanza) utilizzando invece KeyValuePair. – fabspro

1

C# è un linguaggio fortemente tipizzato con un tipo sistema che applica una regola per cui le funzioni non possono avere nessuno (void) o 1 valore restituito. C# 4.0 introduce la classe Tuple:

Tuple<int, int> MyMethod() 
{ 
    return Tuple.Create(0, 1); 
} 

// Usage: 
var myTuple = MyMethod(); 
var row = myTuple.Item1; // value of 0 
var col = myTuple.Item2; // value of 1 
+13

Un linguaggio fortemente tipizzato non è limitato alla restituzione di un singolo valore. Scheme è un esempio. Forte tipizzazione! = Tipizzazione statica; Python e Scheme sono tipizzati fortemente ma dinamicamente. –

+2

Questo è vero, probabilmente si dovrebbe dire che il sistema di tipo C# limita i valori di ritorno delle funzioni a un singolo tipo. –

+0

In effetti, è vero :) –

6

Un'estensione potrebbe ottenere più vicino a Python tuple disimballaggio, non più efficiente, ma più leggibile (e Pythonic):

public class Extensions 
{ 
    public static void UnpackTo<T1, T2>(this Tuple<T1, T2> t, out T1 v1, out T2 v2) 
    { 
    v1 = t.Item1; 
    v2 = t.Item2; 
    } 
} 

Tuple<int, int> MyMethod() 
{ 
    // some work to find row and col 
    return Tuple.Create(row, col); 
} 

int row, col;  
MyMethod().UnpackTo(out row, out col); 
mylist[row][col]; // do work on this element 
8

Poiché C# 7, è possibile utilizzare ValueTuple:

Install-Package System.ValueTuple 

Poi si può comprimere e decomprimere ValueTuples:

(int, int) MyMethod() 
{ 
    return (row, col); 
} 

(int row, int col) = MyMethod(); 
// mylist[row][col]