수색…


비고

ReadOnlyCollection 은 기존 컬렉션 ( '소스 컬렉션')에 대한 읽기 전용 뷰를 제공합니다.

항목은 ReadOnlyCollection 직접 추가되거나 ReadOnlyCollection 에서 제거되지 않습니다. 대신 원본 컬렉션에서 추가되고 제거되며 ReadOnlyCollection 은 이러한 변경 내용을 원본에 반영합니다.

ReadOnlyCollection 내의 요소 수와 순서는 수정할 수 없지만 범위에 있다고 가정 할 경우 요소의 속성이 될 수 있고 메서드를 호출 할 수 있습니다.

외부 코드에서 컬렉션을 수정할 수 없어도 볼 수는 있지만 컬렉션을 직접 수정할 수있게하려면 ReadOnlyCollection 사용합니다.

참고 사항

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections 대 ImmutableCollection

ReadOnlyCollectionImmutableCollection 을 작성한 후에는 편집 할 수 없다는 점에서 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