2009-07-13 12 views
5

मैं कई तरीकों पर अपने कस्टम संग्रह को सॉर्ट करने के लिए एक्सटेंशन विधियों ऑर्डरबी और फिर से उपयोग कर रहा हूं। इस प्रकार संग्रह को प्रभावित नहीं करता है बल्कि इसके बदले और IEnumberable। मैं अपने कस्टम संग्रह में IENumerable परिणाम डालने में असमर्थ हूं। क्या मेरे संग्रह के क्रम को बदलने या आईनेमरेबल परिणाम को मेरे कस्टम संग्रह में बदलने के लिए वैसे भी है?मैं IENumerable को C# में कस्टम प्रकार में कैसे परिवर्तित करूं?

उत्तर

6

अपने संग्रह प्रकार लागू करता है तो IList<T> (यह करने के लिए Add() करने में सक्षम हो) आप एक विस्तार विधि लिख सकते हैं:

public static Extensions 
{ 
    public static TColl ToTypedCollection<TColl, T>(this IEnumerable ien) 
     where TColl : IList<T>, new() 
    { 
     TColl collection = new TColl(); 

     foreach (var item in ien) 
     { 
      collection.Add((T) item); 
     } 

     return collection; 
    } 
} 
+0

उत्कृष्ट, धन्यवाद! –

+0

इस विचार ने पूरी तरह से मेरी मदद की। धन्यवाद! – jeremcc

+0

यह मजाकिया था, मेरे पास एक ही सवाल था, एक ही जवाब के साथ आया, और मैं अभी भी यह देखने के लिए देख रहा हूं कि ऐसा करने का एक बेहतर तरीका है या नहीं ... – Nevyn

1

कोई नहीं है। जब आप क्वेरी ऑपरेटर का उपयोग करते हैं, तो यह गणना उत्पन्न करने के लिए मूल संग्रह के उदाहरणों का उपयोग नहीं करता है। इसके बजाय, यह कार्यक्षमता प्रदान करने के लिए निजी कार्यान्वयन (संभावित रूप से अज्ञात, संभवतः नहीं) का उपयोग करता है।

यदि आप इसे अपने मूल संग्रह में चाहते हैं, तो आपके पास उस प्रकार के निर्माता होना चाहिए जो IEnumerable<T> (या जो भी आपके संग्रह स्टोर, यदि यह विशिष्ट है) लेता है और फिर क्वेरीर को क्वेरी पास कर लेता है।

फिर आप इस का उपयोग To<YourCollectionType> बुलाया IEnumerable<T> के लिए एक विस्तार विधि है जो IEnumerable<T> लेने के लिए और फिर इसे अपने प्रकार के निर्माता को पारित और वापसी कि होगा बनाने के लिए कर सकते हैं।

+0

या एक कास्टिंग ऑपरेटर, इस मामले के लिए बेहतर लगता है। – Dykam

+0

टाइपो: कास्टिंग ऑपरेटर – Dykam

1

नहीं। आप ToList और ToDictionary एक्सटेंशन विधियों द्वारा स्थापित पैटर्न का पालन कर सकते हैं - IENumerable से अपना स्वयं का संग्रह प्रकार लोड करने के लिए एक समान एक्सटेंशन विधि लिखें।

0

आप अपने कस्टम संग्रह को क्रमबद्ध करने में सक्षम होने के लिए आईसीओएमपेयर का अपना उदाहरण लिख सकते हैं।

ब्रूट फोर्स आप आईनेमरेबल के माध्यम से लूप कर सकते हैं और प्रत्येक आइटम को अपने कस्टम संग्रह के नए उदाहरण में वापस डंप कर सकते हैं।

0

आप IEnumerable के साथ एक सूची से प्रारंभ कर सकते हैं:

तो आइटम IEnumerable प्रकार की है, तो आप इस तरह एक सूची बना सकते हैं:

var list = new List<string>(items); 

या आप बस items.ToList कह सकते हैं ():

var list = items.ToList(); 
0

आपके कस्टम संग्रह को कौन से इंटरफेस लागू करते हैं?

तो इसकी एक IList तो आप IEnumerable पर .ToList() करने के लिए, तो इसकी एक IDictionary तो आप IEnumerable आदि पर .ToDictionary() ऐसा करने में सक्षम हो जाएगा सक्षम होगा ..

इसे आपके लिए कुछ और अधिक व्यावहारिक बनाने के लिए।

आप IENumerable के लिए एक एक्सटेंशन विधि लिख सकते हैं। ToMyCollection() यदि कुछ भी समान नहीं है।

0

अंक और संग्रह काफी अलग जानवर हैं।

गणना केवल इंडेक्स-आधारित एक्सेसर्स, गणना-संपत्ति और इसी तरह के संग्रह के दौरान, अच्छी तरह से, गणना करने की अनुमति देती है। संग्रह बनाने के लिए आपको वास्तव में IENumerable का आकलन करना होगा। विशिष्ट संग्रह जैसे सूची < टी > में एक कन्स्ट्रक्टर होगा जो एक आईनेमरेबल स्वीकार करेगा। फिर भी, गणना की जाएगी।

0

यदि आप System.Linq में देखते हैं।गणनीय वर्ग वहाँ कुछ विस्तार तरीकों कि आप या तो आप किसी सरणी के लिए IEnumerable प्रकार परिवर्तित करने के लिए aloow जाएगा, ToList

var myEnumerable = this.GetEnumerator(); 

var array = myEnumerable.ToArray(); 
var list myEnumerable.ToList(); 

आप इस दृष्टिकोण का पालन करें और एक कस्टम विस्तार विधि है कि अपने कस्टम संग्रह करने के लिए परिवर्तित कर देंगे बना सकते हैं

public static CustomCollection<TSource> ToCustomCollection<TSource>(this IEnumerable<TSource> source); 
0

LINQ ठंडा है क्योंकि यह इस तरह के स्रोत संग्रह को अपरिवर्तनीय मानता है - यह उन्हें संशोधित नहीं कर रहा है। एक्सटेंशन विधियों का उपयोग करके उन्हें निर्दिष्ट वैकल्पिक क्रम में आसानी से समझा जाता है - आप इस तरह से एक नई कस्टम सूची नहीं बना रहे हैं।

मैं दो विकल्प सुझाव है:

  1. एक नई सूची अपने आप को अपने LINQ-इंग
  2. अपने कस्टम संग्रह में क्षमता छँटाई लागू के परिणामों के आधार का निर्माण (या एक के रूप में एक अच्छा sortable सामान्य संग्रह का उपयोग आधार) तो यह जगह में सॉर्ट कर सकते हैं।
0

तुम सच में सब पर एक कस्टम संकलन प्रकार की ज़रूरत है? ऐसा लगता है कि आप जो कुछ भी करना चाहते हैं, वह मौजूदा जेनेरिक संग्रह प्रकारों द्वारा प्रदान किया जाता है, और शायद आपको केवल एक विस्तार विधि या उनके लिए जोड़ना होगा।

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