Search code examples
c#.netc#-4.0readonlyreadonly-collection

IList<IList<T>> to IReadonlyCollection<IReadonlyCollection<T>>


I have a list of string array and I would like to make both collection read-only.

So I have this code:

public XmlPatternTree(IList<string> nodeNames, IList<IList<string>> attributeNames,
        IList<IList<string>> attributeValues) : this()
    {
        NodeNames = new ReadOnlyCollection<string>(nodeNames);
        AttributeNames = new ReadOnlyCollection<ReadOnlyCollection<string>>();
        AttributeValues = attributeValues;
        Depth = NodeNames.Count;
    }

My issue is that AttributeNames and AttributeValues assignments causes a compilation error, it seems that I can create a ReadonlyCollection of ReadonlyCollection from a non-readonly collection of non-readonly objects.

Is there something I can do other than looping over all the values and add them in the list ?

Thanks


Solution

  • If you change your type from IList<string> to just List<string>, then this should work:

    attributeNames.Select((x) => x.AsReadOnly()).ToList().AsReadOnly();
    

    If you can't modify your method signature (i.e. you have to keep IList<string>), then you can do this:

    attributeNames.Select((x) => x.ToList().AsReadOnly()).ToList().AsReadOnly();