C# C指数超出范围。必须为非负数且小于集合的大小

C# C指数超出范围。必须为非负数且小于集合的大小,c#,C#,最近我在做一个关于开发编辑器的项目, 为什么C列表允许我使用ADD函数,但我不能通过索引赋值 有人能帮忙吗 List<List<String>> datalist = new List<List<String>>(); .... datalist[tag.Count-1]=datasublist; 一个无关的旁白,正如我在评论中指出的,你可以替换 line.Substring(26, EndOfIndex) 与 默认情况下,它将返回字符串

最近我在做一个关于开发编辑器的项目, 为什么C列表允许我使用ADD函数,但我不能通过索引赋值 有人能帮忙吗

List<List<String>> datalist = new List<List<String>>();  
 ....
datalist[tag.Count-1]=datasublist;
一个无关的旁白,正如我在评论中指出的,你可以替换

line.Substring(26, EndOfIndex)


默认情况下,它将返回字符串的其余部分。还将允许您删除EndOfIndex变量。

我假设错误在这行:

datalist[tag.Count-1]=datasublist;
乍一看,我觉得你想要一本字典,或者更好,也许是一本字典。在这种情况下,您可以存储value标记.Count-1,甚至可以存储刚刚添加的标记的值。但是再仔细想想,上面的这一行正在循环中重复,看起来你只是想把一堆字符串添加到一个相关列表中

因此,我建议使用类将标记名及其关联数据存储在一起:

这将允许您执行以下操作:

List<TagInfo> tags = new List<TagInfo>();

while (line != null)
{

    if (line.Substring(0, 26) == "CRDI-CONTROL %%LINES-BEGIN")
    {
        string tagName = line.Substring(26);
        TagInfo tag = new TagInfo {TagName = tagName};
        tags.Add(tag);

        line = reader.ReadLine();
        while (line.Substring(0, 24) != "CRDI-CONTROL %%LINES-END")
        {
            tag.Data.Add(line.Replace(" ", String.Empty));

            line = reader.ReadLine();
        }
    }

如果以后需要按名称查找标记,您可以更高级,使用字典。只需将标记名存储为密钥。您可以添加一个采用标记名的构造函数,甚至根据需要创建自己的TagInfoCollection,从而进一步清理代码。

第一次尝试按索引引用元素时,您的列表是否包含任何数据?您可以将line.Substring26、EndOfIndex替换为line.Substring26。默认情况下,它将返回字符串的其余部分。错误似乎在datalist[tag.Count-1]上。。。在访问集合之前,未向集合中添加任何内容该行无法在我的程序tag.Data.Addline.Replace、String.Empty中运行;
datalist[tag.Count-1]=datasublist;
class TagInfo
{
    public string TagName {get; set;}
    private readonly List<string> data = new List<string>();
    public List<string> Data {get {return data;}}
}
List<TagInfo> tags = new List<TagInfo>();

while (line != null)
{

    if (line.Substring(0, 26) == "CRDI-CONTROL %%LINES-BEGIN")
    {
        string tagName = line.Substring(26);
        TagInfo tag = new TagInfo {TagName = tagName};
        tags.Add(tag);

        line = reader.ReadLine();
        while (line.Substring(0, 24) != "CRDI-CONTROL %%LINES-END")
        {
            tag.Data.Add(line.Replace(" ", String.Empty));

            line = reader.ReadLine();
        }
    }