2011-12-15 78 views
11

Trong Python tôi có thể viếtTuples và giải nén hỗ trợ chuyển nhượng trong 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 

Nhưng trong C# tôi thấy mình viết ra

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 

Cách Pythonic là obivously sạch hơn nhiều. Có cách nào để làm điều này trong C#?

+1

Tôi có thể sử dụng các tham số cho điều đó .. –

+1

@MikeChristensen: Nguyên tắc thiết kế khung khuyên bạn nên chống lại các tham số nếu chúng có thể tránh được. – dtb

+1

@MikeChristensen Tôi nghĩ về các tham số ngoài, nhưng chúng khiến tôi cảm thấy dơ bẩn vì lý do nào đó –

Trả lời

14

Có một bộ Tuple lớp trong .NET:

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

Nhưng không có cú pháp nhỏ gọn cho giải nén chúng như bằng Python:

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

Lưu ý đối với trình đọc nhân quả: 'Tuple <...>' là chuẩn trong chỉ .NET4 +. –

+0

Lưu ý cho các độc giả khác, một bộ 2-bit có thể được tạo ra trong .NET <4 (về bản chất) bằng cách sử dụng một KeyValuePair thay thế. – fabspro

1

C# là một ngôn ngữ mạnh mẽ, đánh máy với một loại hệ thống thực thi quy tắc mà các hàm có thể không có (void) hoặc 1 giá trị trả lại. C# 4.0 giới thiệu các lớp 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

Một ngôn ngữ được đánh máy mạnh không bị hạn chế để trả lại một giá trị duy nhất. Đề án là một ví dụ. Gõ mạnh mẽ! = Gõ tĩnh; Python và Scheme được gõ mạnh mẽ nhưng tự động. –

+2

Điều này đúng, có lẽ nên được nói rằng hệ thống kiểu của C# hạn chế các giá trị trả về của các hàm thành một kiểu duy nhất. –

+0

Thật vậy, điều đó cũng đúng :) –

6

Một phần mở rộng có thể nhận được nó gần gũi hơn với Python tuple giải nén, không hiệu quả hơn nhưng dễ đọc hơn (và 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

Kể từ C# 7, bạn có thể sử dụng ValueTuple:

Install-Package System.ValueTuple 

Sau đó, bạn có thể đóng gói và giải nén ValueTuples:

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

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