.NET 4.0 में केवल-सूची या अनम्य सूची को पढ़ें


100

मैं जो बता सकता हूं, .NET 4.0 में अभी भी केवल पढ़ने योग्य सूचियों का अभाव है। फ्रेमवर्क में अभी भी इस कार्यक्षमता की कमी क्यों है? क्या यह डोमेन-संचालित डिज़ाइन के लिए कार्यक्षमता के सबसे सामान्य टुकड़ों में से एक नहीं है ?

जावा के C के कुछ फायदों में से एक यह संग्रह के रूप में है ।unmodifiablelist (सूची) विधि के रूप में है, जो ऐसा लगता है कि IList <T> या सूची <T> में लंबे समय से अधिक है।

उपयोग करना IEnumerable<T>सवाल का सबसे आसान समाधान है -ToList का उपयोग किया जा सकता है और एक प्रति वापस करता है।


लगता है कि केवल वास्तविक तरीके से पढ़ने के लिए एक ही रास्ता है List<T>, अपना खुद का लिखना है, कोई भी ऐसा वर्ग नहीं है जो मुझे पता हो कि मैं List<T>बॉक्स के बाहर "लाइन केवल" की विशेषताओं का समर्थन करता हूं जैसे कि Contains, LINQ क्वेरी, आदि।
jrh

जवाबों:


146

आप खोज रहे हैं ReadOnlyCollection, जो लगभग .NET2 के बाद से है।

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

या

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

यह केवल-पढ़ने के लिए दृश्य बनाता है , जो लिपटे संग्रह में किए गए परिवर्तनों को दर्शाता है।


1
मुझे यह सवाल थोड़ा अजीब लग रहा है - और ReadOnlyCollection के बारे में पता नहीं है
क्रिस एस

54
मत बनो - न ही मैंने, जब मैं एक ही चीज की तलाश में गया और आपका सवाल पाया
रोलाण्ड टीपीपी

9
यह एक कष्टप्रद कठिन वर्ग है। यह System.Collections.ObjectModel नाम स्थान की बजाय System.Collections.Generic है जहाँ मैं इसे खोजने की उम्मीद करूँगा। मुझे लगता है कि यह इसलिए है क्योंकि जेनेरिक नामस्थान मौजूद होने से पहले यह था। फिर भी मुझे उम्मीद है कि बेस क्लास ObjectModel में रहेगा और जेनेरिक क्लास को जेनेरिक में जोड़ा जाएगा। मुझे लगता है कि उनके कारण थे, लेकिन मुझे यह कष्टप्रद लगता है।
BlueMonkMN

5
@BlueMonkMN: कृपया यह जानने के लिए इस लेख को देखें कि यह संग्रह से अलग क्यों है। सामान्य नामस्थान।
उचेता

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

13

उन लोगों के लिए जो इंटरफेस का उपयोग करना पसंद करते हैं: .NET 4.5 जेनेरिक IReadOnlyListइंटरफ़ेस जोड़ता है जो List<T>उदाहरण के लिए लागू किया गया है।

यह IReadOnlyCollectionएक Itemअनुक्रमणिका गुण के समान है और जोड़ता है ।



11

यदि सूची का सबसे सामान्य पैटर्न सभी तत्वों के माध्यम से पुनरावृत्त करना है, IEnumerable<T>या IQueryable<T>प्रभावी रूप से केवल पढ़ने के लिए सूची के रूप में कार्य कर सकता है।


4
यदि आप अपनी सूची को IEnumerable के रूप में उजागर करते हैं, तो उपभोक्ता बस इसे वापस सूची में डाल सकता है और इसे संशोधित कर सकता है।
जूलियनआर

4
बेशक, लेकिन यह बुलेटप्रूफ उपाय करने का इरादा नहीं है - आप शायद निजी क्षेत्रों को भी पढ़ सकते हैं और मूल सूची को ट्रैक कर सकते हैं। यह इरादे का वर्णन करने के रूप में अधिक है कि यह केवल पढ़ने के लिए रहना चाहिए।
अना बेट्स

5
आप ToList()या तो कॉल करके मूल सूची को संशोधित नहीं कर रहे हैं , बस एक कॉपी
क्रिस एस

ध्यान दें कि IEnumerable"केवल पढ़ने के लिए" विधियों का एक पूरा सेट नहीं है, उदाहरण के लिए इसमें जैसे तरीके शामिल नहीं हैं Contains
jrh

8

2.0 में आप AsReadOnlyसूची का केवल-पढ़ने के लिए संस्करण प्राप्त करने के लिए कॉल कर सकते हैं। या IListकिसी ReadOnlyCollection<T>वस्तु में एक मौजूदा लपेटो ।


यह कलेक्शंस के बराबर है ।unmodifiablelist (सूची) मैं बाद में था
क्रिस एस

मुझे .NET 4 में यह याद आया क्योंकि मैं एक सच्चे सूची <T> के बजाय IList <T> का उपयोग कर रहा था। यह सुनिश्चित करना सुनिश्चित करें कि AsReadOnly अभी भी .NET 4 में उपलब्ध है जब तक आप आ लिस्ट <T> के साथ काम कर रहे हैं।
BlueMonkMN

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.