如何在C#中将List<string>转换为ReadOnlyCollection<string>

56

我想将输入的项目转换为字符串列表:

System.Collections.ObjectModel.ReadOnlyCollection<string>

我尝试了以下方法:

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

但它返回了一个错误。


5个回答

71

46
如果你有这样的代码: List<string> names=new List<string>(){"Rod", "Jane", "Freddy"}; 那么你可以使用如下代码: ReadOnlyCollection<string> readOnlyNames=names.AsReadOnly(); 该操作并不会复制列表,而是创建一个只读集合来存储原始列表的引用,并且禁止修改它。但是,如果您通过names修改了基础列表,那么readOnlyNames也将发生变化,因此最好在能够的情况下放弃可写实例。

6

@Errorstacks... 感谢您的投票。但是您不应该剽窃。 - John Hartsock
@Errorstacks....哈哈,有趣的是我从未说过你在抄袭我。但你却从MSDN上复制了完全相同的代码。只需引用链接并进行描述即可。 - John Hartsock

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

3
其他回答都是正确的,你需要将一个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());
}

5
你的 source.ToReadOnlyCollection() 等同于内置的 source.ToList().AsReadOnly()。另外,你的代码根据传入的 IEnumerable<> 是否已经是 IList<> 行为不同。如果是 IList<>,那么源可变集合的任何将来更改都会反映在你的 ReadOnlyCollection<> 中;否则,你的 ReadOnlyCollection<> 就相当于不可变的。 - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接