通过在循环内添加更多元素来扩展foreach循环

时间:2014-07-21 13:55:44

标签: c# loops foreach

我有循环

        List<int> list = new List<int>();
        list.Add(1);
        list.Add(2);
        list.Add(3);

        int listCount = list.Count;
        for (int i = 0; i < listCount; i++) // Loop through List with for
        {
            if (i == 2)
            {
                list.Add(666);
                listCount++;
            }
            System.Diagnostics.Debug.Write(list[i]);                
        }

我想知道如何将相同的逻辑应用于 foreach 循环? (在 foreach 循环中添加更多元素)。

这样的事情:

        List<int> list = new List<int>();
        list.Add(1);
        list.Add(2);
        list.Add(3);

        foreach (int i in list)
        {
            if (i == 2)
            {
                list.Add(666);
                //do something to refresh the foreach loop
            }
            System.Diagnostics.Debug.Write(list[i]);
        }

6 个答案:

答案 0 :(得分:4)

  

我想知道如何将相同的逻辑应用于foreach循环?

你不应该而且你不能。 foreach循环内无法修改

请参阅:foreach, in (C# Reference)

  

如果您需要在源集合中添加或删除项目,请使用   for loop。

一种方法是制作List的副本,然后处理原始列表,如:

foreach (int i in list.ToList())
{
    if (i == 2)
    {
        list.Add(666);
        //do something to refresh the foreach loop
    }
    System.Diagnostics.Debug.Write(list[i]);
}

list.ToList将复制列表,foreach循环将对其起作用,从而使您免于异常。但这更像是 hack ,因为您没有在foreach循环中迭代原始列表。

答案 1 :(得分:1)

你不能。 foreach循环取决于IEnumerable的行为,结果是在项的迭代期间无法修改集合。每次尝试对集合执行这些类型的修改时,都会收到运行时异常。

答案 2 :(得分:1)

您可以自己编写一个自定义枚举器或集合,允许您在枚举时修改集合。另一方面,你可能应该完全做其他事情。

我不确定你要做什么,但对我来说这看起来好多了:

    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);

    var outputList = new List<int>();
    foreach (int i in list)
    {
        if (i == 2)
        {
            outputList.Add(666);
            //do something to refresh the foreach loop
        }
        outputList.Add(list[i]);
    }

只需创建一个新的清单。尽量不要改变数据结构。那很脆弱。通常最好从旧数据创建新数据。

答案 3 :(得分:1)

不完全是你想要做的,但你可以做这样的事情......

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);

List<int> list2 = new List<int>();
list2 = list;

foreach (int i in list)
{
    if (i == 2)
    {
        list2.Add(666);
    }
    System.Diagnostics.Debug.Write(list[i]);
    i++; // increment i
}

list = list2;

答案 4 :(得分:1)

如果您正在寻找 consize解决方案,您可以使用 Linq 而不是 for loop foreach循环无法在 foreach 循环中更改集合):

  List<int> list = new List<int>();

  list.Add(1);
  list.Add(2);
  list.Add(3);

  // add required "666" items
  list.AddRange(Enumerable.Repeat(666, list.Count(x => x == 2)));

  // print out all items
  foreach(item in list)
    System.Diagnostics.Debug.Write(item); 

答案 5 :(得分:0)

是和否,已经给出了2个答案。

有一种方法可以在foreach循环中修改集合(实际列出),使用以下语法,来自LINQ:

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.ForEach(elt => {
     if(elt == 2) {
         list.Add(666);
     }
      System.Diagnostics.Debug.Write(elt);
});

但要小心......如果你在条件中将“2”添加到你的列表中,你就会变得无限:)