【问题标题】:Trouble removing items in arraylist删除数组列表中的项目时遇到问题
【发布时间】:2017-10-25 15:37:59
【问题描述】:

案例:

我正在将对象添加到我的数组列表中,在我将对象添加到我的数组列表之前,我会检查相同的对象是否已经不存在。之后我尝试将完整的数组列表重写为文本文件。

代码:

WaardeObjecten obj = new WaardeObjecten(index.ToString(), allFiles[index].ToString(), values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15], values[16], values[17]);    

//Check if duplcatie
foreach (WaardeObjecten item in listOfWaardeObjecten)
{
      if (item.getIndex() == obj.getIndex())
      {
               listOfWaardeObjecten.Remove(item);
      }
}

//Add to arraylist
listOfWaardeObjecten.Add(obj);

//writedata to log file
writeLogFile();

将所有arraylist元素写入.txt文件的代码:

//Creating a streamwriter to write to the file with the path of logFileName.
using (FileStream fs = new FileStream(logFileName, FileMode.Truncate, FileAccess.Write))
using (var sw = new StreamWriter(fs))
{
      foreach (WaardeObjecten item in listOfWaardeObjecten)
      {
           sw.WriteLine(item.getTotalString());
      }
}

现在我收到以下错误:

“在 mscorlib.dll 中发生了“System.InvalidOperationException”类型的未处理异常。”

“附加信息:集合已更改。可能无法执行库存操作。”

更新

我现在用来删除重复项的代码:

//Check if duplcatie
for (int i = listOfWaardeObjecten.Count - 1; i >= 0; i--)
{
     if (i == obj.getIndex())
     {
           listOfWaardeObjecten.RemoveAt(i);
     }
}

//Add to arraylist
listOfWaardeObjecten.Add(obj);

//writedata to log file
writeLogFile();

我用来编写文本文件的代码:

//Creating a streamwriter to write to the file with the path of logFileName.
using (FileStream fs = new FileStream(logFileName, FileMode.Truncate, FileAccess.Write))
using (var sw = new StreamWriter(fs))
{
     foreach (WaardeObjecten item in listOfWaardeObjecten)
     {
          sw.WriteLine(item.getTotalString());
     }
}

如果我首先使用所有不同的值制作 10-15 张图像,然后倒回到第一张图像并将所有值放在“N.v.t.”上,则输出:

 2. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm04.JPG : Discipline: Preset1 | Soort: Preset1 | Afdruk: Preset1 | Test1: Preset1 | Test2: Preset1 | Test3: Preset1 | Test4: Preset1 | Test5: Preset1 | Test6: Preset1.
 4. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm06.JPG : Discipline: Preset1 | Soort: Preset1 | Afdruk: Preset1 | Test1: Preset1 | Test2: Preset1 | Test3: Preset1 | Test4: Preset1 | Test5: Preset1 | Test6: Preset1.
 6. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm08.JPG : Discipline: Preset1 | Soort: Preset1 | Afdruk: Preset1 | Test1: Preset1 | Test2: Preset1 | Test3: Preset1 | Test4: Preset1 | Test5: Preset1 | Test6: Preset1.
 8. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\Detail tbv blisemafleiding A-1101.jpg : Discipline: Preset1 | Soort: Preset1 | Afdruk: Preset1 | Test1: Preset1 | Test2: Preset1 | Test3: Preset1 | Test4: Preset1 | Test5: Preset1 | Test6: Preset1.
 10. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\IMG-20131108-01010.jpg : Discipline: Preset1 | Soort: Preset1 | Afdruk: Preset1 | Test1: Preset1 | Test2: Preset1 | Test3: Preset1 | Test4: Preset1 | Test5: Preset1 | Test6: Preset1.
 1. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm02.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  3. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm05.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  5. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\A 1101 laadarm07.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  7. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\beschadigde isolatie.jpg : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  9. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\A-1101-OSBL\99_History\fotos\Foto tbv bliksemafleiding 1.jpg : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  11. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\C-1106-final\99_History\Inspecties\DSC00864.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  12. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\C-1107-fnal\99_History\Inspecties\DSC00864.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  13. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\H-1104-final\99_History\Inspecties\100_0671.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..
  14. C:\Users\Gebruiker\Desktop\MCA JPG2\05_Mechanical\01_Equipment\1100-final\P-1111-final\99_History\Onderhouds rapportages\2014 wk50  div schades\P-1111 eerste schadepomp  2.JPG : Discipline: N.v.t. | Soort: N.v.t. | Afdruk: N.v.t. | Test1: N.v.t. | Test2: N.v.t. | Test3: N.v.t. | Test4: N.v.t. | Test5: N.v.t. | Test6: N.v.t..

如您所见,并非所有值都是“N.v.t.”的更新。

希望任何人都可以提供帮助!

【问题讨论】:

  • 您无法修改使用foreach 迭代的集合。尝试 for 循环并向后迭代。
  • 所以我必须使用 for 循环而不是 for each?并在 (i) 处删除?我如何调用该对象的 getIndex() 函数?
  • 是的,应该可以,从末尾开始,然后使用 i-- 向后工作。
  • 示例:listOfWaardeObjecten[2].getIndex() 不起作用?
  • listOfWaarObjecten[2] 返回一个 WaardeObject,它不知道它的索引。确实没有必要,因为您已经知道索引 (i) 是 2。

标签: c# file-io


【解决方案1】:

在集合上使用foreach 循环时,您不能从集合中修改/删除项目。但是,如果您想从集合中删除项目,请改用 for 循环。

for (int i = listOfWaardeObjecten.Count-1; i >= 0; i--)
{
   if (i == obj.getIndex())
      {
         listOfWaardeObjecten.RemoveAt(i);
      }
}

如果你不想使用 for 循环,你可以使用break 语句和foreach 循环。 See here.

【讨论】:

  • 如上面 Equalsk 所述,您需要对集合进行迭代倒计时,因为删除后索引号会发生变化。所以使用for (int i = lostOfWaardeObjecten.Count - 1; i >= 0; i--) { ... }
  • 由于某种原因,代码看起来不错,但它还不能在我的程序中运行,我可以更新帖子吗?还是我需要做一个新的?看不出为什么它不起作用。
  • 我尝试了 5 张图片,所有 5 张图片(重复)都进入了 IF 条件。
  • 它说我不能在数组列表中使用 .Where。
  • 我可以把它改成这样的列表,但是我从来没有用过列表,给我一秒钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-05-22
  • 1970-01-01
  • 2021-11-18
  • 2021-02-04
  • 1970-01-01
相关资源
最近更新 更多