c# List 不添加项目

标签 c# list

解决方案:对该方法进行了多次调用,因此调用删除的次数超过了现有项的次数。

在我的程序中,我需要从列表中删除项目。但是一旦我进入 RemoveAt() 命令,我得到一个 ArgumentOutOfRangeException,它告诉我我所有的列表的计数都是 0,或者换句话说,都是空的。但是,尽管它说它们是空的,但对象已创建并且所有方法和事件都运行良好。这是我的部分代码:

我的 list :

        measure = new List<Messen>(maxAblaufe);
        steuern = new List<Steuern>(maxAblaufe);
        model = new List<Model>(maxAblaufe);

        measureReflector = new List<EventReflector>(maxAblaufe);
        steuernReflector = new List<EventReflector>(maxAblaufe);

创建列表:

    if (nextSet < maxAblaufe)
        {
            neuerAblauf na = new neuerAblauf();
            na.Show();
            //if (model.Count == nextSet)
                model.Add(new Model());
            na.Model = model.ElementAt(nextSet);
            model.ElementAt(nextSet).Index = nextSet;
            na.eventStartAblauf += this.startAblauf;
        }

和:

public void startAblauf(object sender, EventArgs e) {
        EventReflector ers = new EventReflector();
        EventReflector erm = new EventReflector();
        steuernReflector.Add(ers);
        measureReflector.Add(erm);
        if (nextSet > 0)
        {
            measure.ElementAt(nextSet-1).eventNextMeasure += measureReflector.ElementAt(nextSet).reflectEvent;
            steuern.ElementAt(nextSet-1).eventNextSteuern += steuernReflector.ElementAt(nextSet).reflectEvent;
        }
        else if (nextSet == 0) {
            timingMessen.eventRefreshData += measureReflector.ElementAt(nextSet).reflectEvent;
            timingSteuerung.eventRefreshSteuerung += steuernReflector.ElementAt(nextSet).reflectEvent;
        }
        model.ElementAt(nextSet).MesstabellePath = "C:\\Users\\myuser\\Documents\\Privat\\MessTest\\Messung" + nextSet + ".csv";
        Messen mess = new Messen(model.ElementAt(nextSet), myPLC, 60 + nextSet * 20, measureReflector.ElementAt(nextSet));
        measure.Add(mess);
        Steuern str = new Steuern(model.ElementAt(nextSet), steuertakt, myPLC, 60 + nextSet * 20, mess, steuernReflector.ElementAt(nextSet));
        steuern.Add(str);

        steuern.ElementAt(nextSet).eventDisconnectAblauf += this.disconnectAblauf;

        nextSet++;
    }

我(尝试)删除项目的部分是这样的:

public void disconnectAblauf(object sender, EventArgs e) {
        SteuernArgs es = (SteuernArgs)e;
        int index = es.index;
        int indexbefore = index;
        indexbefore--;
        int indexafter = index;
        indexafter++;
        if (index > 0 && nextSet > (indexafter))
        {
            measure.ElementAt(indexbefore).eventNextMeasure += measureReflector.ElementAt(indexafter).reflectEvent;
            steuern.ElementAt(indexbefore).eventNextSteuern += steuernReflector.ElementAt(indexafter).reflectEvent;
        }
        else if (index == 0 && nextSet > (indexafter)) {
            timingMessen.eventRefreshData += measureReflector.ElementAt(indexafter).reflectEvent;
            timingMessen.eventRefreshData -= measureReflector.ElementAt(index).reflectEvent;
            timingSteuerung.eventRefreshSteuerung += steuernReflector.ElementAt(indexafter).reflectEvent;
            timingSteuerung.eventRefreshSteuerung -= steuernReflector.ElementAt(index).reflectEvent;
        }


        steuernReflector.RemoveAt(index);
        steuern.RemoveAt(index);
        measure.RemoveAt(index);
        measureReflector.RemoveAt(index);
        model.RemoveAt(index);

我已经尝试了很多东西,所以可能会有一些注释行或“无用”行,请尽量忽略它们,谢谢!

编辑:

(在我看来)相关代码的精简版:

measure = new List<Messen>(maxAblaufe);
        steuern = new List<Steuern>(maxAblaufe);
        model = new List<Model>(maxAblaufe);

        measureReflector = new List<EventReflector>(maxAblaufe);
        steuernReflector = new List<EventReflector>(maxAblaufe);


        EventReflector ers = new EventReflector();
        EventReflector erm = new EventReflector();
        steuernReflector.Add(ers);
        measureReflector.Add(erm);

        model.ElementAt(nextSet).MesstabellePath = "C:\\Users\\myuser\\Documents\\Privat\\MessTest\\Messung" + nextSet + ".csv";
        Messen mess = new Messen(model.ElementAt(nextSet), myPLC, 60 + nextSet * 20, measureReflector.ElementAt(nextSet));
        measure.Add(mess);
        Steuern str = new Steuern(model.ElementAt(nextSet), steuertakt, myPLC, 60 + nextSet * 20, mess, steuernReflector.ElementAt(nextSet));
        steuern.Add(str);

        steuernReflector.RemoveAt(index);
        steuern.RemoveAt(index);
        measure.RemoveAt(index);
        measureReflector.RemoveAt(index);
        model.RemoveAt(index);

最佳答案

我认为问题在于您将索引存储在 Index 属性中。假设集合中有三个项目,首先删除索引为 0 的项目。这将缩短 List 并且 Index 属性为 2 的项目将移动到索引 1 . 然而,这意味着如果您现在运行 remove 方法,该项目将不再位于位置 2 并且尝试访问它将会抛出 ArgumentOutOfRangeException

关于c# List 不添加项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51357770/

相关文章:

c# - 尝试在 ASP.NET Core 应用程序中使用 SmtpClient 发送电子邮件时出现错误

c# - 如何从故障转移组名称获取主服务器和辅助服务器名称。有 C# 代码示例吗?

c++ - 数组 vs vector vs 列表

android - 如何使用 dart/flutter 中的共享首选项保存和获取列表列表

list - F# 拆分列表

python - 是否有一种非递归方法将每个列表元素分成自己的列表?

c# - ResourceManager - 如何找到嵌入式资源文件所需的基本名称?

c# - Entity Framework 6. 禁用模型缓存

c# - 在 View 中找不到命名空间,在 Controller 中工作

Python - 如果字符串列表不在字典键中,则从字典列表中删除字典