यह उपलब्ध नहीं है क्योंकि आईनेमरेबल एक अग्रेषित केवल इटरेटर है। इसमें केवल MoveNext() विधि है। इससे इंटरफ़ेस बहुत सार्वभौमिक और लिंक का मूल बनाता है। बहुत सारे वास्तविक विश्व संग्रह हैं जिन्हें पीछे की ओर नहीं किया जा सकता है क्योंकि इसके लिए संग्रहण की आवश्यकता होती है। उदाहरण के लिए अधिकांश धाराएं इस तरह हैं।
लिंक रिवर्स() एक्सटेंशन विधि के साथ समाधान प्रदान करता है। यह पहले तत्वों को संग्रहित करके काम करता है, फिर उन्हें पीछे की तरफ घुमाता है। हालांकि यह बहुत अपमानजनक हो सकता है, इसके लिए ओ (एन) भंडारण की आवश्यकता होती है। यह संग्रह के लिए संभावित अनुकूलन अनुपलब्ध है जो पहले ही अनुक्रमित है। आप कौन सा ठीक कर सकते हैं:
static class Extensions {
public static IEnumerable<T> ReverseEx<T>(this IEnumerable<T> coll) {
var quick = coll as IList<T>;
if (quick == null) {
foreach (T item in coll.Reverse()) yield return item;
}
else {
for (int ix = quick.Count - 1; ix >= 0; --ix) {
yield return quick[ix];
}
}
}
}
नमूना उपयोग:
var list = new List<int> { 0, 1, 2, 3 };
foreach (var item in list.ReverseEx()) {
Console.WriteLine(item);
}
आप LinkedList के लिए एक विशेषज्ञता बनाने के लिए है, क्योंकि यह IList <> लागू नहीं करता है चाहता हूँ, लेकिन अभी भी त्वरित पीछे की ओर अंतिम के माध्यम से यात्रा की अनुमति देता है और लिंक्ड लिस्ट नोड। पूर्व गुण। हालांकि उस वर्ग का उपयोग न करने के लिए यह बेहतर है, लेकिन इसमें लुसी सीपीयू कैश इलाका है। जब आपको सस्ते आवेषण की आवश्यकता नहीं होती है तो हमेशा सूची <> का पक्ष लें।यह ऐसा दिखाई दे सकता:)
public static IEnumerable<T> ReverseEx<T>(this LinkedList<T> list) {
var node = list.Last;
while (node != null) {
yield return node.Value;
node = node.Previous;
}
}
स्रोत
2012-02-18 13:59:43
दिलचस्प सवाल है, 'MoveNext (' एक रिवर्स प्रगणक के लिए एक विरोधाभास प्रतीत थोड़े हैं हालांकि मैं साथ संगतता के लिए लगता है कि '' foreach' GetReverseEnumerator() 'विधि वास्तव में अभी भी करने के लिए होगा एक 'आईएन्यूमेरेटर' वापस लौटाएं और इस प्रकार उस विधि की आवश्यकता होगी, भले ही 'MovePrevious()' मेरे दिमाग के लिए अधिक उचित लगेगा – RobV
रिवर्स linq एक्सटेंशन विधि है जो कुछ समान प्राप्त करती है ... – RQDQ
'IList' को लागू करने वाले प्रकारों पर हमें मिलता है linq से एक कुशल 'रिवर्स'। दुर्भाग्य से हर प्रकार जो 'रिवर्स' को कुशलता से कार्यान्वित नहीं कर सकता है, 'IList 'को भी कार्यान्वित कर सकता है। उदाहरण के लिए एक दोगुनी लिंक्ड सूची। इसलिए मैं सहमत हूं कि उन संग्रहों को 'रिवर्स()' विधि में बनाया गया है, यह अच्छा होगा। –
CodesInChaos