Как пропустить определенную позицию в пределах a для каждого цикла в 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.
5 ответов
это очень легко пропустить первый пункт в списке:
foreach(var item in list.Skip(1))
{
System.Diagnostics.Debug.WriteLine(item.ToString());
}
если вы хотите пропустить любой другой элемент в index 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());
}
A 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());
}
Я люблю списки .По каждому, здесь я с помощью @Элиана .SkipAt (n) and .По каждому элементу:
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, один из вариантов заключается в том, что вы можете пропустить действие внутри цикла foreach, используя оператор if, например
foreach(var item in liste)
{
if (item != 'X')
{
//do something
}
}
но я жду лучших решений