迭代过程中收集异常并从该集合中删除项目

时间:2010-03-30 12:23:02

标签: c# c#-3.0 c#-2.0

我在foreach循环中从ArrayList中删除项目并获得以下异常。

收藏被修改;枚举操作可能无法执行。

如何删除foreach中的项目

编辑 可能要删除一项或两项或全部。

以下是我的代码:

/*
 * Need to remove all items from 'attachementsFielPath' which does not exist in names array.
 */

try
{
    string attachmentFileNames = txtAttachment.Text.Trim(); // Textbox having file names.
    string[] names = attachmentFileNames.Split(new char[] { ';' });

    int index = 0;

    // attachmentsFilePath is ArrayList holding full path of fiels user selected at any time.
    foreach (var fullFilePath in attachmentsFilePath)
    {
        bool isNeedToRemove = true;

        // Extract filename from full path.
        string fileName = fullFilePath.ToString().Substring(fullFilePath.ToString().LastIndexOf('\\') + 1);

        for (int i = 0; i < names.Length; i++)
        {
        // If filename found in array then no need to check remaining items.
        if (fileName.Equals(names[i].Trim()))
        {
            isNeedToRemove = false;
            break;
        }
        }

        // If file not found in names array, remove it.
        if (isNeedToRemove)
        {
        attachmentsFilePath.RemoveAt(index);
        isNeedToRemove = true;
        }

        index++;
    }
}
catch (Exception ex)
{
    throw ex;
}

编辑:您还可以提供有关代码的建议。我是否需要将其分解为小方法和异常处理等。

无效的参数异常从ArrayList创建通用列表

foreach (var fullFilePath in new List<string>(attachmentsFilePath))

{

alt text http://img641.imageshack.us/img641/1628/invalidargument1.png

当我使用List<ArrayList>时,例外是 参数'1':无法从'System.Collections.ArrayList'转换为'int'

attachmentsFilePath声明如下

ArrayList attachmentsFilePath = new ArrayList();

但是当我这样宣布时,问题就解决了

List<ArrayList> attachmentsFilePath = new List<ArrayList>();

7 个答案:

答案 0 :(得分:6)

另一种方法,从最后开始并删除你想要的那些:

List<int> numbers = new int[] { 1, 2, 3, 4, 5, 6 }.ToList();
for (int i = numbers.Count - 1; i >= 0; i--)
{
    numbers.RemoveAt(i);
}

答案 1 :(得分:5)

迭代时,您无法从集合中删除项目。

您可以找到需要删除的项目的索引,并在迭代完成后将其删除。

int indexToRemove = 0;

// Iteration start

if (fileName.Equals(names[i].Trim()))
{
    indexToRemove = i;
    break;
}

// End of iteration

attachmentsFilePath.RemoveAt(indexToRemove);

但是,如果您需要删除多个项目,请迭代列表的副本:

foreach(string fullFilePath in new List<string>(attachmentsFilePath))
{
    // check and remove from _original_ list
}

答案 2 :(得分:2)

您可以迭代集合的副本:

foreach(var fullFilePath in new ArrayList(attachmentsFilePath))
{
    // do stuff
}

答案 3 :(得分:2)

    List<string> names = new List<string>() { "Jon", "Eric", "Me", "AnotherOne" };
    List<string> list = new List<string>() { "Person1", "Paerson2","Eric"};

    list.RemoveAll(x => !names.Any(y => y == x));
    list.ForEach(Console.WriteLine);

答案 4 :(得分:0)

枚举(或使用foreach)时,您无法修改该集合。如果您确实要删除项目,则可以标记它们,然后使用其Remove方法将其从列表中删除

答案 5 :(得分:0)

执行以下操作:

foreach (var fullFilePath in new List(attachmentsFilePath))
{

这样您可以创建原始列表的副本以进行迭代

答案 6 :(得分:0)

您可以遍历集合以查看需要删除的项目,并将这些索引存储在单独的集合中。最后,您需要循环遍历要以相反顺序删除的索引,并从原始集合中删除每个索引。

list<int> itemsToDelete

for(int i = 0; i < items.Count; i++)
{
    if(shouldBeDeleted(items[i]))
    {
        itemsToDelete.Add(i);
    }
}

foreach(int index in itemsToDelete.Reverse())
{
    items.RemoveAt(i);
}