c#列表未添加项目

时间:2018-07-16 08:40:55

标签: c# list

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

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

我的列表:

        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);

1 个答案:

答案 0 :(得分:3)

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