2011-11-15 127 views
22

我要轉換的項目進入到一個字符串列表:如何轉換列表<string>到ReadOnlyCollection <string>在C#

System.Collections.ObjectModel.ReadOnlyCollection<string> 

我已經嘗試使用:

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

但它返回一個錯誤。

+0

可能重複http://stackoverflow.com/questions/7227611/return-readonlycollection-from-ilist) – nawfal

回答

2

ReadOnlyCollection的構造函數接受一個I​​List

下面是一些參考http://msdn.microsoft.com/en-us/library/ms132476.aspx

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

@Errorstacks ...感謝downvote。但你不應該抄襲。 –

+0

和你一樣..但是在回答這個問題之前我沒有看到你的答案... –

+0

@Errorstacks ....哈哈它的有趣我從來沒有說過你會抄襲我。但是您從MSDN複製了確切的代碼。只需參考鏈接並描述。 –

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

如果你有:

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

然後你就可以說:

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

這不復制該列表。相反,只讀集合存儲對原始列表的引用並禁止更改它。但是,如果您通過names修改基礎列表,則readOnlyNames也將更改,因此如果可以,最好放棄可寫實例。

0

其他答案是正確的,因爲您需要將IList<T>傳遞給ReadOnlyCollection<T>的構造函數。

我發現有用的是具有促進所述ReadOnlyCollection<T>的創建上IEnumerable<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()); 
} 
[自IList <>返回ReadOnlyCollection](的
+5

所以你的'source.ToReadOnlyCollection()'與內置的'source.ToList()。AsReadOnly()'非常相似。 (另外,根據傳入的IEnumerable <>是否已經是IList <>',你的代碼的行爲會有所不同,如果這個源集合的未來突變將會反映在你的'ReadOnlyCollection <> ';如果不是那麼你的''ReadOnlyCollection <>'是有效的不可變的。) – LukeH

相關問題