2009-07-08 10 views
16

मैं इस सवाल से पूछने के लिए लगभग शर्मिंदा हूं, लेकिन लंबे समय तक सी प्रोग्रामर मुझे लगता है कि शायद मुझे सी # में ऐसा करने का सबसे अच्छा तरीका पता नहीं है।सी # में दो सूचियों को वापस करने का सबसे अच्छा तरीका क्या है?

मेरे पास एक सदस्य कार्य है जिसे मुझे कस्टम प्रकार (List<MyType>) की दो सूचियों को वापस करने की आवश्यकता है और मुझे पहले से पता है कि मेरे पास हमेशा इनमें से केवल दो सूचियों का वापसी मूल्य होगा।

स्पष्ट विकल्प हैं:

public List<List<MyType>> ReturnTwoLists(); 

या

public void ReturnTwoLists(ref List<MyType> listOne, ref List<myType> listTwo); 

दोनों गैर इष्टतम होने लगते हैं।

इसे सुधारने के तरीके पर कोई सुझाव?

पहला तरीका यह वाक्यविन्यास में स्पष्ट नहीं करता है कि केवल 2 सूचियां लौटाई जा रही हैं, और दूसरा संदर्भ संदर्भ देता है, फिर एक वापसी मूल्य, जो कि गैर-सी # लगता है।

उत्तर

31

सबसे पहले, कि शायद out, नहीं ref होना चाहिए।

दूसरा, आप दो सूचियों वाले एक प्रकार की घोषणा और वापसी कर सकते हैं।

तीसरा, आप एक सामान्य Tuple घोषित करने और उस का एक उदाहरण लौट सकते हैं:

class Tuple<T,U> { 
    public Tuple(T first, U second) { 
     First = first; 
     Second = second; 
    } 
    public T First { get; private set; } 
    public U Second { get; private set; } 
} 

static class Tuple { 
    // The following method is declared to take advantage of 
    // compiler type inference features and let us not specify 
    // the type parameters manually. 
    public static Tuple<T,U> Create<T,U>(T first, U second) { 
     return new Tuple<T,U>(first, second); 
    } 
} 

return Tuple.Create(firstList, secondList); 

आप आइटम के विभिन्न संख्या के लिए इस विचार का विस्तार कर सकते हैं।

+7

बस एक शेष ... .NET 4.0 में टुपल <> प्रकार है। –

+12

मुझे लगता है कि आपने आइटम निर्दिष्ट करने के लिए टी और यू का उपयोग किया था। यदि आपके पास 2-टुपल से अधिक था, तो क्या आप टी-यू-वी-डब्ल्यू ... या टी-यू-पी-एल-ई के लिए जाएंगे? :) –

+5

@ मार्क: इसके बारे में सोचा नहीं है। इससे पहले कि मैं इसके बारे में सोचूं, मैं एफ # पर स्विच करने के बारे में सोचूंगा! –

24

वापसी इस:

सभी की
public class MyTwoLists { 
    public List<MyType> ListOne {get;set;} 
    public List<MyType> ListTwo {get;set;} 
} 
0

एक साधारण संरचना बनाएं जो दोनों को रखती है और कार्य के आउटपुट के रूप में इसे वापस लाती है?

4

आपका पहला सुझाव दो सूचियां नहीं है। यह सूचियों की एक सूची है।

दूसरा विकल्प आपके द्वारा किए जाने वाले कार्यों को करेगा, लेकिन हो सकता है कि आप इसे रेफरी के बजाय बाहर कीवर्ड का उपयोग करने के लिए बदलना चाहें ताकि आपकी विधि के कॉलर्स आपके द्वारा किए जा रहे कार्यों के इरादे को जान सकें। ,

public Pair<List<MyType>,List<MyType> ReturnTwoLists() 
{ 
     return new Pair(new List<MyType(), new List<MyType()); 
} 

आप बाहर या रेफरी पैरामीटर का उपयोग कर सकते हैं के रूप में आपका उल्लेख किया:

एक जोड़ी का उपयोग करता है, तो सूचियों क्रम में व्यर्थ कर रहे हैं:

public void ReturnTwoLists(out List<MyType> listOne, out List<myType> listTwo); 
3

आप कुछ ही विकल्प हैं । यह एक अच्छा विकल्प है यदि एक सूची दूसरे की तुलना में अधिक सार्थक है।

आप एक शब्दकोश का उपयोग कर सकता है, तो ग्राहक कुंजी पता चल जाएगा, या काम करना चाहता है उन्हें देखने के लिए:

public Dictionary<string,List<MyType> ReturnTwoLists() 
{ 
     Dictionary<string,List<MyTpe>> d = new Dictionary<string,List<MyType>>(); 
     d.Add("FirstList",new List<MyType>()); 
     d.Add("SecondList",new List<MyType>()); 
     return new Dictionary()(new List<MyType(), new List<MyType()); 
} 

या, मेरी आँखों में सबसे "सही" समाधान, पूर्णता के लिए और स्थिरता, दो सूचियों को पकड़ने के लिए एक साधारण डेटा कंटेनर वर्ग बनाना होगा।यह एक उपभोक्ता को मजबूती से टाइप किया गया, अच्छी तरह से स्थिर रूप से संकलित (पढ़ा: इंटेलिजेंस-सक्षम) के साथ काम करने के लिए वापसी मूल्य प्रदान करता है। इस विधि के बगल में कक्षा को घोंसला लगाया जा सकता है।

संबंधित मुद्दे