2011-11-15 14 views
22

chcę przekonwertować pozycjami wpisanymi na listę String do:Jak konwertować Lista <string> do ReadOnlyCollection <string> w C#

System.Collections.ObjectModel.ReadOnlyCollection<string> 

Próbowałem, używając:

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

Ale zwraca błąd .

+0

możliwe duplikat [Return ReadOnlyCollection z IList <>] (http://stackoverflow.com/questions/7227611/return-readonlycollection-from-ilist) – nawfal

Odpowiedz

2

Konstruktor ReadOnlyCollection akceptuje IList

Oto niektóre odniesienia http://msdn.microsoft.com/en-us/library/ms132476.aspx

var myreadonlycollection = new ReadOnlyCollection<string>(listname); 
+0

@Errorstacks ... Dzięki za spóźnienie. ale nie powinieneś plagiatować. –

+0

to samo dla ciebie .. ale nie widziałem twoich ans zanim odpowiedziałem na to pytanie ... –

+0

@Errorstacks .... lol jego zabawny nigdy nie powiedziałem, że kopiujesz mnie. Ale skopiowałeś dokładny kod z MSDN. Wystarczy odwołać się do linku i opisać. –

3
var readonlyCollection = new ReadOnlyCollection<string>(list); 
26

Jeśli masz:

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

Wtedy można powiedzieć:

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

To nie kopiuje listę. Zamiast tego kolekcja tylko do odczytu przechowuje odniesienie do oryginalnej listy i zabrania jej zmieniania. Jeśli jednak zmodyfikujesz podstawową listę za pomocą names, zmieni się również readOnlyNames, więc najlepiej jest odrzucić zapisywalną instancję, jeśli możesz.

0

Inne odpowiedzi są poprawne, ponieważ należy przekazać IList<T> konstruktorowi obiektu ReadOnlyCollection<T>.

uważam, że warto mieć metodę rozszerzenia na IEnumerable<T> który ułatwia utworzenie 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()); 
} 
+5

Więc twój 'source.ToReadOnlyCollection()' jest prawie równoważny wbudowanemu 'source.ToList(). AsReadOnly()'. (Również twój kod zachowuje się inaczej, w zależności od tego, czy przekazany "IEnumerable <>" jest już "IList <>". Jeśli tak jest, to jakiekolwiek przyszłe mutacje z tej kolekcji będą odzwierciedlone w twoim 'ReadOnlyCollection <> '; jeśli nie, to' ReadOnlyCollection <> 'jest skutecznie niezmienne.) – LukeH