Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IList<;IList<;T>&燃气轮机;到IReadonlyCollection<;IReadonlyCollection<;T>&燃气轮机;_C#_.net_C# 4.0_Readonly_Readonly Collection - Fatal编程技术网

C# IList<;IList<;T>&燃气轮机;到IReadonlyCollection<;IReadonlyCollection<;T>&燃气轮机;

C# IList<;IList<;T>&燃气轮机;到IReadonlyCollection<;IReadonlyCollection<;T>&燃气轮机;,c#,.net,c#-4.0,readonly,readonly-collection,C#,.net,C# 4.0,Readonly,Readonly Collection,我有一个字符串数组列表,我想将这两个集合都设置为只读 所以我有这个代码: public XmlPatternTree(IList<string> nodeNames, IList<IList<string>> attributeNames, IList<IList<string>> attributeValues) : this() { NodeNames = new ReadOnlyCollec

我有一个字符串数组列表,我想将这两个集合都设置为只读

所以我有这个代码:

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;
    }
公共XmlPatternTree(IList节点名、IList属性名、,
IList AttributeValue):此()
{
节点名称=新的只读集合(节点名称);
AttributeName=新的ReadOnlyCollection();
AttributeValue=AttributeValue;
深度=节点名称。计数;
}
我的问题是AttributeName和AttributeValue赋值会导致编译错误,似乎我可以从非只读对象的非只读集合创建ReadonlyCollection的ReadonlyCollection

除了循环所有值并将它们添加到列表中,我还能做些什么吗


谢谢

如果您将您的类型从
IList
更改为仅
List
,那么这应该可以工作:

attributeNames.Select((x) => x.AsReadOnly()).ToList().AsReadOnly();
如果无法修改方法签名(即,必须保留
IList
),则可以执行以下操作:

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

如果您将您的类型从
IList
更改为仅
List
,那么这应该可以工作:

attributeNames.Select((x) => x.AsReadOnly()).ToList().AsReadOnly();
如果无法修改方法签名(即,必须保留
IList
),则可以执行以下操作:

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

如果.net framework的版本大于4.0,则
List
的通用版本将实现
IReadOnlyCollection
接口。 如果对您更方便,您可以将签名从
IList
更改为
List
,应该可以正常工作

 AttributeNames = attributeNames;
 AttributeValues = attributeValues;

如果.net framework的版本大于4.0,则
List
的通用版本将实现
IReadOnlyCollection
接口。 如果对您更方便,您可以将签名从
IList
更改为
List
,应该可以正常工作

 AttributeNames = attributeNames;
 AttributeValues = attributeValues;

请注意
IReadOnlyList
类型的协方差(类似于vasil oreshenski的答案)

如果您决定:

public XmlPatternTree(IReadOnlyList<string> nodeNames, 
  IReadOnlyList<IReadOnlyList<string>> attributeNames,
  IReadOnlyList<IReadOnlyList<string>> attributeValues) : this()
{
  NodeNames = nodeNames;
  AttributeNames = attributeNames;
  AttributeValues = attributeValues;
}

public IReadOnlyList<string> NodeNames { get; private set; }
public IReadOnlyList<IReadOnlyList<string>> AttributeNames  { get; private set; }
public IReadOnlyList<IReadOnlyList<string>> AttributeValues { get; private set; }
public int Depth => NodeNames.Count;
公共XmlPatternTree(IReadOnlyList节点名,
IReadOnlyList属性名称,
IReadOnlyList AttributeValue):this()
{
节点名称=节点名称;
AttributeName=AttributeName;
AttributeValue=AttributeValue;
}
公共IReadOnlyList节点名{get;private set;}
公共IReadOnlyList属性名称{get;private set;}
公共IReadOnlyList属性值{get;private set;}
public int Depth=>NodeNames.Count;
在您的类中,上述协方差意味着您可以使用引用转换,而不是在另一个类中使用任何换行,如:

var nn=新列表();
var an=新列表();
var av=新列表();
//填充“nn”、“an”和“av”
//以下编译没有包装器类:
var-tree=新的XmlPatternTree(nn,an,av);
当然,人们可以将接口转换回实际的类型,如
List
,如果他们猜测类型实际上就是数组列表,则可以不使用反射来修改集合。然而,这将是非常恶性的,所以您可以假设,如果只有“好”的人使用您的类,这是没有问题的


PS!我在上面用
IReadOnlyList
所说和编码的内容也可以用
IReadOnlyCollection
来完成,因为它也是协变的(“code>out”)。您将不具有对属性的索引器访问权限(例如
var name=tree.AttrbuteNames[idx1][idx2]
)。但是,您可以使用
HashSet
和类似的方法,它们不是
IReadOnlyList
,只需注意
IReadOnlyList
类型的协方差(类似于vasil oreshenski的答案)

如果您决定:

public XmlPatternTree(IReadOnlyList<string> nodeNames, 
  IReadOnlyList<IReadOnlyList<string>> attributeNames,
  IReadOnlyList<IReadOnlyList<string>> attributeValues) : this()
{
  NodeNames = nodeNames;
  AttributeNames = attributeNames;
  AttributeValues = attributeValues;
}

public IReadOnlyList<string> NodeNames { get; private set; }
public IReadOnlyList<IReadOnlyList<string>> AttributeNames  { get; private set; }
public IReadOnlyList<IReadOnlyList<string>> AttributeValues { get; private set; }
public int Depth => NodeNames.Count;
公共XmlPatternTree(IReadOnlyList节点名,
IReadOnlyList属性名称,
IReadOnlyList AttributeValue):this()
{
节点名称=节点名称;
AttributeName=AttributeName;
AttributeValue=AttributeValue;
}
公共IReadOnlyList节点名{get;private set;}
公共IReadOnlyList属性名称{get;private set;}
公共IReadOnlyList属性值{get;private set;}
public int Depth=>NodeNames.Count;
在您的类中,上述协方差意味着您可以使用引用转换,而不是在另一个类中使用任何换行,如:

var nn=新列表();
var an=新列表();
var av=新列表();
//填充“nn”、“an”和“av”
//以下编译没有包装器类:
var-tree=新的XmlPatternTree(nn,an,av);
当然,人们可以将接口转换回实际的类型,如
List
,如果他们猜测类型实际上就是数组列表,则可以不使用反射来修改集合。然而,这将是非常恶性的,所以您可以假设,如果只有“好”的人使用您的类,这是没有问题的

PS!我在上面用
IReadOnlyList
所说和编码的内容也可以用
IReadOnlyCollection
来完成,因为它也是协变的(“code>out”)。您将不具有对属性的索引器访问权限(例如
var name=tree.AttrbuteNames[idx1][idx2]
)。但是您可以使用
HashSet
和类似的工具,它们不是
IReadOnlyList