C #: неизменный вид объектов списка? - PullRequest
19 голосов
/ 16 апреля 2010

У меня есть список, и я хочу предоставить доступ только для чтения к коллекции, содержащей ее содержимое.Как я могу это сделать?

Что-то вроде:

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>.

Ответы [ 3 ]

22 голосов
/ 16 апреля 2010

Если вы хотите неизменный список элементов, вы можете вернуть ReadOnlyCollection , вызвав AsReadOnly () в вашем списке:

public IList<Foo> ImmutableViewOfInventory() 
{
    List<Foo> inventory = new List<Foo>();
    inventory.Add(new Foo());
    return inventory.AsReadOnly();
}

Возвращает реализацию IList, которая строго типизирована и не может быть изменена.

Это не , однако предотвращает изменения любого из элементов, содержащихся в списке (если они не являются типами значений). Для этого каждый элемент должен быть клонирован (глубоко клонирован, если они сами содержат другие объекты) и добавлен в новый список только для чтения, который возвращается из вашего метода ImmutableViewOfInventory. К сожалению, вам придется реализовать это самостоятельно.

3 голосов
/ 16 апреля 2010

Вы смотрели на ReadOnlyCollection ?

http://msdn.microsoft.com/en-us/library/ms132474.aspx

0 голосов
/ 16 апреля 2010

новая коллекция ReadOnlyCollection (инвентарь);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...