C#: Неизменное представление объектов списка?

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

Что-то как:

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

20
задан Nick Heiner 15 April 2010 в 23:26
поделиться

3 ответа

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

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

Это возвращает реализацию Список IList , который является строго типизированным и не модифицируемым.

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

24
ответ дан 30 November 2019 в 00:47
поделиться

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

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

3
ответ дан 30 November 2019 в 00:47
поделиться

новый ReadOnlyCollection (инвентарь);

0
ответ дан 30 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: