खोज…


टिप्पणियों

एक ReadOnlyCollection एक मौजूदा संग्रह ('स्रोत संग्रह') को केवल पढ़ने के लिए दृश्य प्रदान करता है।

आइटम सीधे किसी ReadOnlyCollection से जोड़े या हटाए नहीं जाते हैं। इसके बजाय, उन्हें स्रोत संग्रह से जोड़ा और हटा दिया जाता है और ReadOnlyCollection स्रोत में इन परिवर्तनों को प्रतिबिंबित करेगा।

ReadOnlyCollection अंदर तत्वों की संख्या और क्रम को संशोधित नहीं किया जा सकता है, लेकिन तत्वों के गुणों और विधियों को बुलाया जा सकता है, यह मानते हुए कि वे दायरे में हैं।

जब आप बाह्य कोड को संशोधित करने के लिए सक्षम किए बिना अपने संग्रह को देखने की अनुमति देना चाहते हैं, तो ReadOnlyCollection उपयोग करें, लेकिन फिर भी संग्रह को स्वयं संशोधित करने में सक्षम हो।

यह सभी देखें

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections बनाम ImmutableCollection

एक ReadOnlyCollection एक से भिन्न ImmutableCollection में है कि आप एक संपादित नहीं कर सकते ImmutableCollection एक बार बनाने - यह हमेशा शामिल होंगे n तत्वों, और वे बदला नहीं जा सकता या पुनर्क्रमित। दूसरी ओर एक ReadOnlyCollection सीधे संपादित नहीं किया जा सकता है, लेकिन स्रोत संग्रह का उपयोग करके तत्वों को अभी भी जोड़ा जा सकता है / हटाया जा सकता है।

ReadOnlyCollection बनाना

कंस्ट्रक्टर का उपयोग करना

एक ReadOnlyCollection निर्माण में एक मौजूदा IList ऑब्जेक्ट को पास करके बनाया गया है:

var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

LINQ का उपयोग करना

अतिरिक्त, LINQ IList ऑब्जेक्ट्स के लिए एक AsReadOnly() एक्सटेंशन विधि प्रदान करता है:

var readOnlyVersion = groceryList.AsReadOnly();

ध्यान दें

आमतौर पर, आप स्रोत संग्रह को निजी रूप से बनाए रखना चाहते हैं और ReadOnlyCollection तक सार्वजनिक पहुंच की अनुमति देते हैं। जब आप इन-लाइन सूची से ReadOnlyCollection बना सकते हैं, तो आप इसे बनाने के बाद संग्रह को संशोधित करने में असमर्थ होंगे।

var readOnlyGroceryList = new List<string> {"Apple", "Banana"}.AsReadOnly();
// Great, but you will not be able to update the grocery list because 
//  you do not have a reference to the source list anymore!

यदि आप अपने आप को ऐसा करते हुए पाते हैं, तो आप एक अन्य डेटा संरचना, जैसे कि एक ImmutableCollection का उपयोग करने पर विचार कर सकते हैं।

ReadOnlyCollection अपडेट करना

एक ReadOnlyCollection को सीधे संपादित नहीं किया जा सकता है। इसके बजाय, स्रोत संग्रह अपडेट किया गया है और ReadOnlyCollection इन परिवर्तनों को प्रतिबिंबित करेगा। यह ReadOnlyCollection की प्रमुख विशेषता है।

var groceryList = new List<string> { "Apple", "Banana" };

var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

var itemCount = readOnlyGroceryList.Count;  // There are currently 2 items

//readOnlyGroceryList.Add("Candy");         // Compiler Error - Items cannot be added to a ReadOnlyCollection object
groceryList.Add("Vitamins");                // ..but they can be added to the original collection

itemCount = readOnlyGroceryList.Count;      // Now there are 3 items
var lastItem = readOnlyGroceryList.Last();  // The last item on the read only list is now "Vitamins"

डेमो देखें

चेतावनी: ReadOnlyCollection में तत्व स्वाभाविक रूप से केवल-पढ़ने के लिए नहीं हैं

यदि स्रोत संग्रह एक प्रकार का है जो अपरिवर्तनीय नहीं है, तो ReadOnlyCollection माध्यम से एक्सेस किए गए तत्वों को संशोधित किया जा सकता है।

public class Item
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public static void FillOrder()
{
    // An order is generated
    var order = new List<Item>
    {
        new Item { Name = "Apple", Price = 0.50m },
        new Item { Name = "Banana", Price = 0.75m },
        new Item { Name = "Vitamins", Price = 5.50m }
    };

    // The current sub total is $6.75
    var subTotal = order.Sum(item => item.Price);

    // Let the customer preview their order
    var customerPreview = new ReadOnlyCollection<Item>(order);

    // The customer can't add or remove items, but they can change 
    //   the price of an item, even though it is a ReadOnlyCollection
    customerPreview.Last().Price = 0.25m;

    // The sub total is now only $1.50!
    subTotal = order.Sum(item => item.Price);
}

डेमो देखें



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow