简体   繁体   中英

c# List doesn't add items

Solution: Had multiple calls to the method and therefore had more called remove more times, than items were existing.

In my programm I need to remove Items out of a List. But once I get to the RemoveAt() command, I get an ArgumentOutOfRangeException and it tells me that all of my Lists have a count of 0, or in other words, are empty. But though it says they are empty, the object were created and all of the methods and events are working just fine. Here's some parts of my code:

My Lists:

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

Creating the Lists:

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

And:

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++;
    }

The part where I (try) to delete the items is this:

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

I already tried a lot of things so there may be some commented lines or "useless" lines, just try to ignore those, thanks!

EDIT:

Trimmed Version of the (in my opinion) relevent code:

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

I think the problem is that you are storing the index in the Index property. Suppose you have three items in the collection, and first you remove the one with index 0. This will shorten the List and item with Index property of 2 will move to index 1. This however means that if you now run the remove method, the item will no longer be on the position 2 and the attempt to access it will throw ArgumentOutOfRangeException .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM