2010-01-11 11 views
5

के साथ जेनेरिक सूचियों से यादृच्छिक चुनें, मैं एक सूची से एक यादृच्छिक तत्व प्राप्त करना संभव बनाने के लिए सबसे अच्छा तरीका ढूंढ रहा हूं जहां टी की अलग-अलग प्रकार की वस्तुएं होंगी जो बेस क्लास से संबंधित नहीं हैं।विभिन्न <T>

मैं सूची में विस्तार विधि बनाने में एक लुकअप कर रहा हूं, या एक सूची प्राप्त करने वाली सहायक विधि, लेकिन मैं इसे एक साथ प्राप्त करने में सक्षम नहीं हूं। हर बार जब मैं टी को संभालने में समस्याएं चलाता हूं जो मुझे नहीं पता कि क्या है।

क्या इंटरफ़ेस या बेस क्लास बनाने के बिना ऐसा करना संभव है? क्योंकि मैं अलग-अलग टी के लिए बेस क्लास या इंटरफेस को लागू करने का कोई सार्थक तरीका नहीं देख सकता हूं।

सादर जेस्पर हाउगे


सामान्य तरीकों के बारे में कुछ और पढ़ने के बाद मैं कुछ कोड अपने आप को लिखने में कामयाब रहे।

private Picture SelectTopPic() 
{ 
    List<Picture> pictures = GetPictureList(); 
    return pictures.RandomItem(); 
} 
+3

क्यों नहीं एक समारोह जो एक सूची हो जाता है और सिर्फ एन-वें तत्व जहां n 0 के बीच की संख्या और सूची की लंबाई है का चयन करके एक टी लौटाता हो? –

+0

मैंने शायद स्पष्ट रूप से स्पष्ट नहीं किया कि मेरी समस्या क्या थी, लेकिन मुझे एक समाधान मिला जो मुझे उपयुक्त था - पोस्ट में मेरा कोड जोड़ा। – Hauge

उत्तर

0

एक विस्तार विधि, मूल पोस्ट करने के लिए एक परिशिष्ट के रूप में दिखाया के साथ जा रहा समाप्त हुई:

वास्तव में कैसे ऊपर है कि MSDN कड़ी में सूची से एक यादृच्छिक तत्व को पुनः प्राप्त करने, का एक उदाहरण है।

.Hauge

3

ऐसी कोई बात नहीं के रूप में "एक आधार वर्ग के माध्यम से संबंधित नहीं वस्तुओं है:

public static class ListExt 
{ 
    public static T RandomItem<T>(this List<T> list) 
    { 
     if (list.Count == 0) 
      return default(T); 
     if (list.Count == 1) 
      return list[0]; 
     Random rnd = new Random(DateTime.Now.Millisecond); 
     return list[(rnd.Next(0, list.Count))]; 
    } 
} 

यह एक विस्तार विधि कि निम्न कोड के साथ किसी भी सूची से एक यादृच्छिक आइटम का चयन सक्षम बनाता है: यह मेरा समाधान है "। यदि कुछ और नहीं है तो आपके पास हमेशा object एस होगा। तो List<object> जो भी आप चाहते हैं वह करेगा।

+0

का उत्तर देने/टिप्पणी करने के लिए धन्यवाद, मुझे इसके बारे में पता था, लेकिन मैं उस विधि की तलाश में था जिसमें मुझे आवश्यकतानुसार एक या अधिक रूपांतरण शामिल नहीं थे। – Hauge

+1

वैसे वे या तो एक ही प्रकार के हैं या वे नहीं हैं। स्थिर टाइप की गई भाषा में कोई वास्तविक मध्य ग्राउंड नहीं है। – Blindy

+0

आप फिर से सही हैं - और आपकी टिप्पणियां मुझे यह लिखने के लिए प्रेरित करती हैं कि मैंने शायद खुद को स्पष्ट रूप से पर्याप्त रूप से समझाया नहीं है। यदि आप उस कोड को देखते हैं जो मैंने इसे समाप्त कर दिया है तो यह शायद अधिक स्पष्ट है। जैसा कि आप देख सकते हैं कि मैं एक ऐसी विधि की तलाश में था जो किसी सूची से एक यादृच्छिक आइटम का चयन करने में सक्षम हो, और इसे टाइप ऑब्जेक्ट के ऑब्जेक्ट्स के बीच आगे और पीछे परिवर्तित किए बिना सूची में जो कुछ भी शामिल है, उसे वापस कर दें। – Hauge

0

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

Random random = new Random(DateTime.Now.Millisecond); 
object randomItem = yourList.ElementAt(random.Next(0, yourList.Length)); 
+0

सूची पर कोई एलिमेंट एट विधि नहीं है, लेकिन मैंने अपने कोड में सामान्य इंडेक्स सिंटैक्स का उपयोग किया था। यह दृष्टिकोण वह था जिसे मैं पहले से उपयोग कर रहा था, लेकिन मैं इसका बहुत उपयोग करने जा रहा था, इसलिए मैं एक सहायक विधि या विस्तार विधि की तलाश में था जिसका उपयोग मैं कर सकता था। मैंने यह देखने के लिए शीर्ष पर मूल पोस्ट देखें। – Hauge

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