.NET Framework
ReadOnlyCollections
खोज…
टिप्पणियों
एक 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);
}