2011-11-15 95 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

相关问题