2011-12-15 11 views
11

पायथन में मैंसी # में टुपल्स और अनपॅकिंग असाइनमेंट समर्थन?

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

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

लिख सकते हैं लेकिन सी # में मुझे लगता है अपने आप को

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 

लिखने pythonic तरीका obivously अधिक स्वच्छ है। क्या सी # में ऐसा करने का कोई तरीका है?

+1

मैं शायद इसके लिए पैरामीटर का उपयोग करूँगा .. –

+1

@ माइक क्रिस्टेनसेन: फ्रेमवर्क डिज़ाइन दिशानिर्देश आउट पैरामीटर के खिलाफ अनुशंसा करते हैं यदि उन्हें टाला जा सके। – dtb

+1

@ माइक क्रिस्टेनसेन मैंने पैरामीटर के बारे में सोचा, लेकिन वे मुझे किसी कारण के लिए गंदे महसूस करते हैं –

उत्तर

14

वहाँ .NET में Tuple कक्षाओं का एक सेट है:

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

लेकिन उन्हें अजगर की तरह खोल के लिए कोई कॉम्पैक्ट वाक्य रचना है:

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

कारण पाठक के लिए नोट: 'Tuple <...>' केवल .NET4 + में मानक है। –

+0

अन्य पाठकों के लिए नोट, एक 2-टुपल को .NET <4 (संक्षेप में) में एक keyValuePair का उपयोग करके बनाया जा सकता है। – fabspro

1

सी # एक प्रकार के साथ एक जोरदार टाइप भाषा है प्रणाली जो नियमों को लागू करती है जो कि किसी भी (void) या 1 वापसी मूल्य हो सकती है। सी # 4.0 टपल वर्ग का परिचय:

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

एक दृढ़ता से टाइप की गई भाषा एक मान को वापस करने के लिए प्रतिबंधित नहीं है। योजना एक उदाहरण है। मजबूत टाइपिंग! = स्थैतिक टाइपिंग; पायथन और योजना दृढ़ता से-गतिशील रूप से टाइप की गई हैं। –

+2

यह सच है, शायद यह कहा जाना चाहिए कि सी # की प्रकार प्रणाली एक ही प्रकार के कार्यों के वापसी मूल्यों को प्रतिबंधित करती है। –

+0

दरअसल, यह सच है :) –

6

विस्तार यह अजगर टपल unpacking के करीब हो सकती है, और अधिक कुशल नहीं लेकिन अधिक पठनीय (और 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

के बाद से सी # 7, आप उपयोग कर सकते हैं ValueTuple:

Install-Package System.ValueTuple 

तो फिर तुम पैक और खोल सकते हैं ValueTuples:

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

(int row, int col) = MyMethod(); 
// mylist[row][col] 
संबंधित मुद्दे