У меня есть список, и я хочу обеспечить доступ только для чтения к набору, содержащему его содержание. Как я могу сделать это?
Что-то как:
public ICollection<Foo> ImmutableViewOfInventory() {
IList<Foo> inventory = new List<Foo>();
inventory.add(new Foo());
return inventory.ImmutableView();
}
Кроме того, неизменное IEnumerable
был бы также прекрасен.
ОБНОВЛЕНИЕ: Я понимаю теперь, когда неизменное представление списка на самом деле было бы лучше. (Сохраняющий список, заказывая семантику.)
Это не даст мне поведение списка, право:
public ReadOnlyCollection<PickUp> InventoryItems()
{
return new ReadOnlyCollection<PickUp>(inventory);
}
Я смотрю в документации, но не сразу вижу ReadOnlyList<T>
.
Если вам нужен неизменяемый список элементов, вы можете вернуть ReadOnlyCollection , вызвав метод AsReadOnly () в вашем списке:
public IList<Foo> ImmutableViewOfInventory()
{
List<Foo> inventory = new List<Foo>();
inventory.Add(new Foo());
return inventory.AsReadOnly();
}
Это возвращает реализацию Список IList
, который является строго типизированным и не модифицируемым.
Он не , а не , однако предотвращает изменения любого из элементов, содержащихся в списке (если только они не являются типами значений). Для этого каждый элемент должен быть клонирован (глубоко клонирован, если они сами содержат другие объекты) и добавлен в новый список только для чтения, который возвращается из вашего метода ImmutableViewOfInventory
. К сожалению, вам придется реализовать это самостоятельно.