解决方案:对该方法进行了多次调用,因此被调用删除的次数比现有项多。
在我的程序中,我需要从列表中删除项目。但是一旦到达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);
答案 0 :(得分:3)
我认为问题在于您将索引存储在Index
属性中。假设您在集合中有3个项目,首先删除索引为0的项目。这将缩短List
,而Index
属性为2的项目将移至索引1。但是,这意味着如果您现在运行remove方法,该项目将不再位于位置2,并且尝试访问该项目将抛出ArgumentOutOfRangeException
。