Как конвертировать список <string>в ReadOnlyCollection <string>в C # - PullRequest
31 голосов
/ 15 ноября 2011

Я хочу преобразовать элементы, введенные в список строк, в:

System.Collections.ObjectModel.ReadOnlyCollection<string>

Я пытался использовать:

(System.Collections.ObjectModel.ReadOnlyCollection<string>)listname

Но возвращается ошибка.

Ответы [ 5 ]

44 голосов
/ 15 ноября 2011

Вы можете создать новый экземпляр, используя существующий список в конструкторе.

var readOnlyList = new ReadOnlyCollection<string>(existingList);

Конструктор ReadOnlyCollection (Of T) в MSDN

31 голосов
/ 15 ноября 2011

Если у вас есть:

List<string> names=new List<string>(){"Rod", "Jane", "Freddy"};

Тогда вы можете сказать:

ReadOnlyCollection<string> readOnlyNames=names.AsReadOnly();

Это не копирует список. Вместо этого коллекция только для чтения хранит ссылку на исходный список и запрещает его изменение. Однако, если вы измените базовый список с помощью names, то readOnlyNames также изменится, поэтому лучше отказаться от доступного для записи экземпляра, если можете.

4 голосов
/ 15 ноября 2011
var readonlyCollection = new ReadOnlyCollection<string>(list);
3 голосов
/ 15 ноября 2011

Конструктор ReadOnlyCollection принимает IList

Вот несколько ссылок http://msdn.microsoft.com/en-us/library/ms132476.aspx

var myreadonlycollection = new ReadOnlyCollection<string>(listname);
1 голос
/ 15 ноября 2011

Другие ответы верны в том, что вам нужно передать IList<T> в конструктор ReadOnlyCollection<T>.

Я считаю полезным иметь метод расширения на IEnumerable<T>, который облегчает созданиеReadOnlyCollection<T>:

public static ReadOnlyCollection<T> ToReadOnlyCollection<T>(
    this IEnumerable<T> source)
{
    if (source == null) throw new ArgumentNullException("source");

    return new ReadOnlyCollection<T>(
        source as IList<T> ?? source.ToList());
}
...