Получение ключа массива в 'foreach' цикле

В случае непредвиденного случая, когда кто-то обнаруживает, что он бьется головой о стену, пытаясь понять, почему сценарий коллеги не будет печатать новые строки, обратите внимание на это ->

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

Как и в выше, фактический запуск метода может сам быть обернут в эхо, которое заменяет любые эхо-сигналы, которые могут быть в самом методе. Очевидно, я опустил это для краткости, это было не так просто заметить!

Затем вы можете сообщить своим товарищам, что лучший способ выполнения функций будет таким:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;
27
задан Peter Mortensen 7 May 2017 в 15:12
поделиться

8 ответов

Способ Грауэнвольфа - самый простой и эффективный способ сделать это с массивом:

Либо используйте цикл for, либо создайте временную переменную, которую вы увеличиваете при каждом проходе. .

Что, конечно, выглядело бы так:

int[] values = { 5, 14, 29, 49, 99, 150, 999 };

for (int key = 0; key < values.Length; ++key)
  if (search <= values[key] && !stop)
  {
    // set key to a variable
  }

В .NET 3.5 вы также можете использовать более функциональный подход, но он немного более многословен на сайте, и это скорее всего, для посещения элементов в IEnumerable полагается пара вспомогательных функций . Избыток, если это все, что вам нужно, но удобно, если вы склонны много обрабатывать коллекцию.

23
ответ дан Community 28 November 2019 в 05:08
поделиться

Если Вы хотите достигнуть ключ (чтение: индекс) тогда необходимо было бы использовать для цикла. Если Вы на самом деле хотите иметь набор, который содержит ключи/значения тогда, я рассмотрел бы использование HashTable или Словаря (если Вы хотите использовать Дженерики).

Dictionary<int, string> items = new  Dictionary<int, string>();

foreach (int key in items.Keys)
{
  Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}

Hope, которая помогает, Tyler

20
ответ дан Tyler 28 November 2019 в 05:08
поделиться

Увы нет никакого встроенного способа сделать это. Или используйте для цикла или создайте временную переменную, которую Вы увеличиваете на каждой передаче.

3
ответ дан Jonathan Allen 28 November 2019 в 05:08
поделиться

Я ответил на это в другой версии этого вопроса:

Foreach является для итерации по наборам той реализацией IEnumerable. Это делает это путем вызова GetEnumerator на наборе, который возвратит Перечислитель.

Этот Перечислитель имеет метод и свойство:

* MoveNext()
* Current

Текущие возвраты объект, что Перечислитель в настоящее время включен, MoveNext, обновляет Текущий к следующему объекту.

, Очевидно, понятие индекса является внешним к понятию перечисления и не может быть сделано.

Из-за этого, большинство наборов в состоянии быть пересеченным с помощью индексатора и для конструкции цикла.

я значительно предпочитаю использовать для цикла в этой ситуации по сравнению с отслеживанием индекса с локальной переменной.

, Как Вы получаете индекс текущего повторения цикла foreach?

3
ответ дан Community 28 November 2019 в 05:08
поделиться

На самом деле необходимо использовать классика для (;;) цикл, если Вы хотите циклично выполниться через массив. Но схожая функциональность, которой Вы достигли со своим кодом PHP, может быть достигнута в C# как это со Словарем:

Dictionary<int, int> values = new Dictionary<int, int>();
values[0] = 5;
values[1] = 14;
values[2] = 29;
values[3] = 49;
// whatever...

foreach (int key in values.Keys)
{
    Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}
2
ответ дан huseyint 28 November 2019 в 05:08
поделиться

Вы можете реализовать эту функцию самостоятельно, используя метод расширения. Например, вот реализация метода расширения KeyValuePairs, который работает со списками:

public struct IndexValue<T> {
    public int Index {get; private set;}
    public T Value {get; private set;}
    public IndexValue(int index, T value) : this() {
        this.Index = index;
        this.Value = value;
    }
}

public static class EnumExtension
{
    public static IEnumerable<IndexValue<T>> KeyValuePairs<T>(this IList<T> list) {
        for (int i = 0; i < list.Count; i++)
            yield return new IndexValue<T>(i, list[i]);
    }
}
0
ответ дан Craig Gidney 28 November 2019 в 05:08
поделиться

Вот решение, которое я только что нашел для этой проблемы

Оригинальный код:

int index=0;
foreach (var item in enumerable)
{
    blah(item, index); // some code that depends on the index
    index++;
}

Обновленный код

enumerable.ForEach((item, index) => blah(item, index));

Метод расширения:

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T, int> action)
    {
        var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can't return a void
        enumerable.Select((item, i) => 
            {
                action(item, i);
                return unit;
            }).ToList();

        return pSource;
    }
0
ответ дан mat3 28 November 2019 в 05:08
поделиться

myKey = Array.IndexOf(values, val);

-9
ответ дан Billy Jo 28 November 2019 в 05:08
поделиться
Другие вопросы по тегам:

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