Подтвердить что ты не робот

Как проверить, является ли сущность первым элементом цикла foreach

Скажем, у меня есть цикл foreach.

Мне нужно что-то сделать с первым объектом цикла, который мне не нужно делать ни с одним из других объектов.

Как проверить, является ли элемент, который в данный момент находится в цикле первым объектом.

4b9b3361

Ответ 1

Существует несколько способов сделать это.

  • Использовать цикл for вместо
  • Установить булевский флаг
  • Используйте Linq для получения списка. Сначала(), а затем foreach через list.Skip(1)

Ответ 2

Мне нравится способ Linq, но без Skip (1), таким образом вы также можете использовать его для последнего элемента в списке, а ваш код остается чистым imho:)

foreach(var item in items)
{
    if (items.First()==item)
        item.firstStuff();

    else if (items.Last() == item)
        item.lastStuff();

    item.otherStuff();
}

Ответ 3

Что-то вроде этого:

bool first = true;

foreach(var item in items)
{
    if (first)
    {
        item.firstStuff();
        first = false;
    }
    item.otherStuff();
}

Ответ 4

Здесь выполняется исполнительное решение:

using (var erator = enumerable.GetEnumerator())
{
    if (erator.MoveNext())
    {
        DoActionOnFirst(erator.Current);

        while (erator.MoveNext())
            DoActionOnOther(erator.Current);
    }
}

EDIT: И здесь LINQ:

if (enumerable.Any())
    {
        DoActionOnFirst(enumerable.First());

        foreach (var item in enumerable.Skip(1))
            DoActionOnOther(item);
    }

ИЗМЕНИТЬ: Если в действиях на элементах есть подписи, подпадающие под Func<TItem, TResult>, вы можете сделать:

enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));

Ответ 5

Это скорее общее решение для получения индекса вместе с каждым объектом в массиве. Должен работать тестирование, если оно первое.

        List<String> entries = new List<string>();
        entries.Add("zero");
        entries.Add("one");
        entries.Add("two");

        Dictionary<int, String> numberedEntries = new Dictionary<int, string>();
        int i = 0;
        entries.ForEach(x => numberedEntries.Add(i++, x));
        foreach (KeyValuePair<int, String> pair in numberedEntries) {
            Console.WriteLine(pair.Key + ": " + pair.Value);
        }

В этой настройке ключ KeyValuePair является индексом, а значение - объектом этого индекса, в моем примере - строкой, но там может быть размещен любой объект. Он добавляет немного накладных расходов, но может быть использован для определения любого объекта в индексе списка, когда это необходимо.

Ответ 6

bool first = true;
foreach(var foo in bar)
{
  if (first)
  {
    // do something to your first item
    first = false;
  }
  // do something else to the rest
}

Ответ 7

Не могу придумать ничего, кроме

var processedFirst = false;
foreach(var x in items) {
    if(!processedFirst) {
        ProcessFirst(x);
        processedFirst = true;
    }

Ответ 8

попробуйте этот

bool IsFirst = true;

foreach(DataRow dr in dt.Rows)
{
    if (IsFirst)
    {
        // do some thing
        IsFirst = false;
    }    
}