Szukaj…


Uwagi

ReadOnlyCollection zapewnia widok tylko do odczytu dla istniejącej kolekcji („kolekcja źródłowa”).

Elementy nie są bezpośrednio dodawane ani usuwane z ReadOnlyCollection . Zamiast tego są one dodawane i usuwane z kolekcji źródłowej, a ReadOnlyCollection odzwierciedla te zmiany w źródle.

Liczby i kolejności elementów w ReadOnlyCollection nie można modyfikować, ale właściwości elementów mogą być, a metody można wywoływać, zakładając, że są w zakresie.

Skorzystaj z ReadOnlyCollection jeśli chcesz zezwolić zewnętrznemu kodowi na przeglądanie Twojej kolekcji bez możliwości jej modyfikacji, ale nadal możesz samodzielnie modyfikować kolekcję.

Zobacz też

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollection vs ImmutableCollection

ReadOnlyCollection różni się od ImmutableCollection tym, że nie można edytować ImmutableCollection po jej utworzeniu - zawsze będzie zawierało n elementów i nie będzie można ich zastąpić ani zmienić kolejności. Z drugiej strony ReadOnlyCollection nie można edytować bezpośrednio, ale elementy można nadal dodawać / usuwać / zmieniać kolejność za pomocą kolekcji źródłowej.

Tworzenie ReadOnlyCollection

Korzystanie z konstruktora

ReadOnlyCollection jest tworzony przez przekazanie istniejącego obiektu IList do konstruktora:

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

Korzystanie z LINQ

Dodatkowo LINQ zapewnia metodę rozszerzenia AsReadOnly() dla obiektów IList :

var readOnlyVersion = groceryList.AsReadOnly();

Uwaga

Zazwyczaj chcesz zachować kolekcję źródłową prywatnie i umożliwić publiczny dostęp do ReadOnlyCollection . Chociaż można utworzyć kolekcję ReadOnlyCollection z listy w wierszu, nie można modyfikować kolekcji po jej utworzeniu.

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!

Jeśli to robisz, możesz rozważyć użycie innej struktury danych, takiej jak ImmutableCollection .

Aktualizowanie kolekcji ReadOnlyCollection

ReadOnlyCollection nie może być edytowany bezpośrednio. Zamiast tego kolekcja źródłowa jest aktualizowana, a ReadOnlyCollection odzwierciedli te zmiany. Jest to kluczowa cecha 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"

Zobacz demo

Ostrzeżenie: elementy w ReadOnlyCollection nie są z natury tylko do odczytu

Jeśli kolekcja źródłowa jest typu, który nie jest niezmienny, elementy dostępne za pośrednictwem ReadOnlyCollection można modyfikować.

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);
}

Zobacz demo



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow