how do I check if an entity is the first element of a foreach loop

Say I have a foreach loop.

I have to do something with the first object of the loop that I don't have to do with any of the other objects.

How do I check if the item that's currently in the loop is the first object.

39
задан Diskdrive 24 August 2010 в 03:21
поделиться

7 ответов

Есть несколько способов сделать это.

  1. Вместо этого используйте цикл for
  2. Установите логический флаг
  3. Используйте Linq, чтобы получить список.First (), а затем выполнить foreach по списку.Skip (1)
39
ответ дан 27 November 2019 в 02:01
поделиться

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

bool first = true;

foreach(var item in items)
{
    if (first)
    {
        item.firstStuff();
        first = false;
    }
    item.otherStuff();
}
25
ответ дан 27 November 2019 в 02:01
поделиться

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

var processedFirst = false;
foreach(var x in items) {
    if(!processedFirst) {
        ProcessFirst(x);
        processedFirst = true;
    }
2
ответ дан 27 November 2019 в 02:01
поделиться
bool first = true;
foreach(var foo in bar)
{
  if (first)
  {
    // do something to your first item
    first = false;
  }
  // do something else to the rest
}
2
ответ дан 27 November 2019 в 02:01
поделиться

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

bool IsFirst = true;

foreach(DataRow dr in dt.Rows)
{
    if (IsFirst)
    {
        // do some thing
        IsFirst = false;
    }    
}
2
ответ дан 27 November 2019 в 02:01
поделиться

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

        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 - это индекс, а значение - это объект по этому индексу, в моем примере это строка, но там можно разместить любой объект. Это добавляет небольшие накладные расходы, но при необходимости может использоваться для определения любого объекта в индексе списка.

4
ответ дан 27 November 2019 в 02:01
поделиться

Вот производительное решение:

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

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

РЕДАКТИРОВАТЬ: А вот LINQ:

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

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

РЕДАКТИРОВАТЬ: Если действия над элементами имеют подписи, назначаемые Func , вы можете сделать:

enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
15
ответ дан 27 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: