繁体   English   中英

如何在 C# 中使用修改后的列表进行迭代和重新迭代时删除项目列表

[英]How to remove list of items while iterating and re-iterate with modified list in C#

我有一个字符串列表,比如List1 ,对于List1的每个item ,将在foreach循环内动态生成另一个列表。 如果生成的列表项存在于List1中的任何item ,则应从List1中删除这些项,并使用List1项的 rest 重新迭代

示例:假设为item1 ,生成List2

ForEach 循环开始:

第一个循环

-- item1 --> Generated List say List2

-- item1 --> remove the List2 items from List1 ( In this case, items(item1,item2,item4) are removed and re-iterate List1 with only 'item3' 

第二循环

 -- item3 ---> generated List say List3

  -- item3 ---> check and remove the List3 items from List1 if existed

循环结束。

实现这一目标的最佳方法是什么?

        private static void IterateListAndRemoveItemsWhileIterating()
        {
            List<string> list1 = new List<string>();
            list1.Add("item1");
            list1.Add("item2");
            list1.Add("item3");
            list1.Add("item4");


            List<string> list2 = new List<string>();
            list2.Add("item1");
            list2.Add("item2");
            list2.Add("item4");

            foreach (var item in list1.ToList())
            {
                Console.WriteLine(item); 
                //Do some logic with each item and get another list of Items and then remove  from List1. (Ex: List2 which is another list of items after processing some logic with item1) 
                list1.RemoveAll(r => list2.Contains(r)); // After removing list2 items in list1, I want to re-iterate with rest of items but its not happening
            }
        }

实际 Output:

item1
item3
item2
item4

预期 Output:

item1
item3

您的变量名称不明确项目是来自 foreach 循环和 lambda 语法的变量名称。 因此编译器可能在您的 lambda 中使用 foreach 变量,这意味着您会将 list1 中的所有项目打印到控制台。 尝试像这样更改其中一个 var 名称:

foreach (var item in list1.ToList())
{
  Console.WriteLine(item); 
  list1.RemoveAll(s => list2.Contains(s));
}

我希望这会给你带来预期的结果

更正

使用list1.ToList()会克隆原始列表,因此即使您对原始列表进行了更改,枚举也不会在 foreach 循环中发生变化。 您可以通过保留第二个列表来避免这种情况:

List<string> enumerationList = list1.ToList();

foreach (var item in enumerationList)
{
  if(list1.Contains(item))
  {
    Console.WriteLine(item); 
    list1.RemoveAll(s => list2.Contains(s));
  }
}

我相信还有其他方法可以做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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