【问题标题】:How to Convert List<string> to ReadOnlyCollection<string> in C#如何在 C# 中将 List<string> 转换为 ReadOnlyCollection<string>
【发布时间】:2011-12-29 17:35:47
【问题描述】:

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

System.Collections.ObjectModel.ReadOnlyCollection<string>

我尝试过使用:

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

但它返回一个错误。

【问题讨论】:

标签: c# .net string collections


【解决方案1】:

您可以使用构造函数中的现有 List 创建一个新实例。

var readOnlyList = new ReadOnlyCollection<string>(existingList);

ReadOnlyCollection(Of T) Constructor on MSDN

【讨论】:

    【解决方案2】:

    如果你有:

    List&lt;string&gt; names=new List&lt;string&gt;(){"Rod", "Jane", "Freddy"};

    那么你可以说:

    ReadOnlyCollection&lt;string&gt; readOnlyNames=names.AsReadOnly();

    这不会复制列表。相反,只读集合存储对原始列表的引用并禁止更改它。但是,如果您通过names 修改底层列表,那么readOnlyNames 也会发生变化,因此如果可以,最好丢弃可写实例。

    【讨论】:

      【解决方案3】:

      ReadOnlyCollection 的构造函数接受一个 IList

      这里有一些参考http://msdn.microsoft.com/en-us/library/ms132476.aspx

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

      【讨论】:

      • @Errorstacks... 感谢您的反对。但你不应该抄袭。
      • @Errorstacks....大声笑我从来没有说过你在抄袭我。但是您从 MSDN 复制了确切的代码。只需参考链接并进行描述。
      【解决方案4】:
      var readonlyCollection = new ReadOnlyCollection<string>(list);
      

      【讨论】:

        【解决方案5】:

        其他答案是正确的,因为您需要将 IList&lt;T&gt; 传递给 ReadOnlyCollection&lt;T&gt; 的构造函数。

        我发现在IEnumerable&lt;T&gt; 上有一个扩展方法有助于ReadOnlyCollection&lt;T&gt; 的创建:

        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&lt;&gt; 是否已经是 IList&lt;&gt;。如果是,那么该源集合的任何未来突变都将反映在您的 ReadOnlyCollection&lt;&gt; 中;如果不是,那么您的ReadOnlyCollection&lt;&gt; 实际上是不可变的。)
        猜你喜欢
        • 1970-01-01
        • 2012-07-19
        • 2013-08-26
        • 1970-01-01
        • 2017-06-03
        • 2019-09-10
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        相关资源
        最近更新 更多