Подтвердить что ты не робот

С#: неизменный вид объектов списка?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

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