Как пропустить определенную позицию в пределах для каждого цикла в диез? - PullRequest
10 голосов
/ 30 октября 2011
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? Я не хочу оценивать какие-либо значения, но просто пропустить позицию х.

Это должна быть конкретная позиция. Можно выбрать позицию 0 или, возможно, позицию 7.

Ответы [ 5 ]

20 голосов
/ 30 октября 2011

Первый элемент в списке очень легко пропустить:

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

В этом примере я использую лямбда-выражение, которое принимает два аргумента: a и b. Аргумент 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());
}
1 голос
/ 30 октября 2011

Вам следует попробовать использовать расширенную версию метода расширения 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
1 голос
/ 30 октября 2011

Мне нравятся списки .ForEach, вот мое мнение, используя @ Elian's .SkipAt (n) и .ForEach:

var list = new List<String> { "A", "B", "C", "D" };
list = list.SkipAt(1).ToList();
list.ForEach(Debug.WriteLine);
1 голос
/ 30 октября 2011

Цикл 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());
}
0 голосов
/ 30 октября 2011

Чтобы пропустить позицию внутри цикла foreach, один из вариантов заключается в том, что вы можете пропустить действие внутри цикла foreach с помощью оператора if, например

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

Но я жду лучших решений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...