С#: неизменный вид объектов списка?
У меня есть список, и я хочу предоставить доступ только для чтения к коллекции, содержащей ее содержимое. Как я могу это сделать?
Что-то вроде:
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>
.
Ответы
Ответ 1
Если вам нужен неизменный список элементов, вы можете вернуть ReadOnlyCollection, вызвав AsReadOnly() в вашем списке:
public IList<Foo> ImmutableViewOfInventory()
{
List<Foo> inventory = new List<Foo>();
inventory.Add(new Foo());
return inventory.AsReadOnly();
}
Это возвращает реализацию IList
, которая является строго типизированной и не модифицируемой.
Однако он не препятствует изменениям в любом из элементов, содержащихся в списке (если только они не являются типами значений). Для этого каждый элемент должен быть клонирован (глубоко клонирован, если они сами содержат другие объекты) и добавляется в новый список только для чтения, который возвращается из вашего метода ImmutableViewOfInventory
. Вам придется реализовать это самостоятельно, к сожалению.
Ответ 2
Вы просмотрели ReadOnlyCollection <T> ?
http://msdn.microsoft.com/en-us/library/ms132474.aspx
Ответ 3
новый ReadOnlyCollection (инвентарь);