[英]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.