【发布时间】:2011-12-29 17:35:47
【问题描述】:
我想将输入到字符串列表的项目转换为:
System.Collections.ObjectModel.ReadOnlyCollection<string>
我尝试过使用:
(System.Collections.ObjectModel.ReadOnlyCollection<string>)listname
但它返回一个错误。
【问题讨论】:
标签: c# .net string collections
我想将输入到字符串列表的项目转换为:
System.Collections.ObjectModel.ReadOnlyCollection<string>
我尝试过使用:
(System.Collections.ObjectModel.ReadOnlyCollection<string>)listname
但它返回一个错误。
【问题讨论】:
标签: c# .net string collections
您可以使用构造函数中的现有 List 创建一个新实例。
var readOnlyList = new ReadOnlyCollection<string>(existingList);
【讨论】:
如果你有:
List<string> names=new List<string>(){"Rod", "Jane", "Freddy"};
那么你可以说:
ReadOnlyCollection<string> readOnlyNames=names.AsReadOnly();
这不会复制列表。相反,只读集合存储对原始列表的引用并禁止更改它。但是,如果您通过names 修改底层列表,那么readOnlyNames 也会发生变化,因此如果可以,最好丢弃可写实例。
【讨论】:
ReadOnlyCollection 的构造函数接受一个 IList
这里有一些参考http://msdn.microsoft.com/en-us/library/ms132476.aspx
var myreadonlycollection = new ReadOnlyCollection<string>(listname);
【讨论】:
var readonlyCollection = new ReadOnlyCollection<string>(list);
【讨论】:
其他答案是正确的,因为您需要将 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());
}
【讨论】:
source.ToReadOnlyCollection() 几乎等同于内置的source.ToList().AsReadOnly()。 (此外,您的代码行为会有所不同,具体取决于传入的 IEnumerable<> 是否已经是 IList<>。如果是,那么该源集合的任何未来突变都将反映在您的 ReadOnlyCollection<> 中;如果不是,那么您的ReadOnlyCollection<> 实际上是不可变的。)