繁体   English   中英

如何跳过c sharp中每个循环的特定位置?

[英]How to skip a specific position within a for each loop in c sharp?

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。

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

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());
}

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());
}

我喜欢list's。ForEach,这是我使用@ Elian的.SkipAt(n)和.ForEach:

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

您应该尝试使用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

要跳过foreach循环内的一个位置,一个选项是你可以使用if语句跳过foreach循环内的动作,比如

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

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

暂无
暂无

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

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