【问题标题】:How to skip a specific position within a for each loop in c sharp?c - 如何在c中跳过每个循环中的特定位置?
【发布时间】:2011-12-18 01:09:52
【问题描述】:
List<string> liste = new List<String> 
        {
            "A","B","C","D"
        };

        foreach (var item in liste)
        {
            System.Diagnostics.Debug.WriteLine(item.ToString());
        }

        for (int i = 0; i < liste.Count; i++)
        {
            if (i == 0)
                continue;
            System.Diagnostics.Debug.WriteLine(liste[i].ToString());
        }

如何跳过 foreach 循环中的特定位置?我不想评估任何值,而只是跳过位置 x。

它必须是一个特定的位置。可以选择位置 0 或位置 7。

【问题讨论】:

  • 你的例子有什么问题? if (i==0) continue 似乎是正确的。
  • 没有问题,但是我有一堆 foreach 循环,我想知道是否有任何命令可以像正常的 for 循环一样执行此操作。试想一下,您在位置 4 的所有列表中都有一些您想跳过的值

标签: c# loops foreach


【解决方案1】:

很容易跳过列表中的第一项:

foreach(var item in list.Skip(1))
{
    System.Diagnostics.Debug.WriteLine(item.ToString());
}

如果你想跳过索引n 处的任何其他元素,你可以这样写:

foreach(var item in list.Where((a,b) => b != n))
{
    System.Diagnostics.Debug.WriteLine(item.ToString());
}

在这个例子中,我使用了一个带有两个参数的 lambda 表达式:ab。参数a 是项目本身,而参数b 是项目的索引。

MSDN 上描述这些扩展方法的相关页面是:

您甚至可以编写自己的扩展方法来跳过列表中的元素:

public static class MyEnumerableExtensions
{
    public static IEnumerable<T> SkipAt<T>(this IEnumerable<T> list, int index)
    {
        var i = 0;

        foreach(var item in list) 
        {
            if(i != index)
                yield return item;

            i++;
        }
    }
}

这将允许你写这样的东西来跳过一个项目:

foreach(var item in list.SkipAt(2))
{
    System.Diagnostics.Debug.WriteLine(item.ToString());
}

【讨论】:

  • 我知道skip,但是你如何跳过特定的位置4? 1,2,3 =好,4=跳过,5,6..=好。
  • +1 比我的回答好得多。我不知道你可以用 Where 做到这一点。
  • @Gero :我修改了答案以涵盖一般情况。
【解决方案2】:

foreach 循环遍历实现 IEnumerable 的集合。枚举器公开当前项和移动到下一项的方法 - 它没有索引的概念。

你总是可以这样做的:

var i = 0;
foreach (var item in liste) {
  if (i++ == skip) continue;
  Debug.WriteLine(item.ToString());
}

但这似乎是不必要的做作。如果您需要索引,请使用 for 循环。

另一种选择是在迭代之前从List 中删除不需要的项目:

foreach (var item in liste.Take(n-1).Union(liste.Skip(n))) {
  Debug.WriteLine(item.ToString());
}

【讨论】:

    【解决方案3】:

    我喜欢 list 的 .ForEach,这是我对 @Elian 的 .SkipAt(n) 和 .ForEach 的看法:

    var list = new List<String> { "A", "B", "C", "D" };
    list = list.SkipAt(1).ToList();
    list.ForEach(Debug.WriteLine);
    

    【讨论】:

      【解决方案4】:

      您应该尝试使用允许您过滤项目和索引的 Where 扩展方法的增强版本。

      检查参考。 http://msdn.microsoft.com/en-us/library/bb549418.aspx

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              static void Main(string[] args)
              {
                  Console.WriteLine("Verbatim list");
                  List<string> list = new List<String> { "A","B","C","D" };
      
                  foreach (var item in list)
                  {
                      Console.WriteLine(item.ToString());
                  }
      
                  Console.WriteLine("Filtered list");
                  int itemToSkip = 2;
                  foreach (var item in list.Where((item, index) => index != itemToSkip))
                  {
                      Console.WriteLine(item.ToString());
                  }
      
                  Console.ReadKey();
              }
          }
      }
      

      这将为您提供以下输出。

      Verbatim list
      A
      B
      C
      D
      Filtered list
      A
      B
      D
      

      【讨论】:

        【解决方案5】:

        要跳过 foreach 循环内的某个位置,一种选择是您可以使用 if 语句跳过 foreach 循环内的操作,例如

        foreach(var item in liste)
        {
            if (item != 'X')
            {
                //do something
            }
        }
        

        但我正在等待更好的解决方案

        【讨论】:

        • 不评估项目 ^^,但以某种方式检查 foreach 在列表中的实际位置。
        猜你喜欢
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多