Объявлять переменную вне цикла foreach

В случае с циклом я могу объявить индекс за пределами оператора for. Например, вместо

for (int i = 0; i < 8; i++) { }

Я могу сделать:

int i;
for (i = 0; i < 8; i++) { }

Теперь в сравнении с циклом foreach, я должен объявить переменную внутри цикла:

foreach (string name in names) { }

И я не могу сделать что-то вроде:

string name;
foreach (name in names) { }

Причина, по которой это меня беспокоит, заключается в том, что после цикла я хочу снова использовать переменную "имя". В случае цикла foreach переменная "name" не может использоваться, поскольку она вне области foreach, и я не могу объявить другую переменную с тем же именем, поскольку она была объявлена ​​ранее в той же области.

Любая идея?

Ответ 1

Ну, вы можете сделать:

string name = null; // You need to set a value in case the collection is empty
foreach (string loopName in names)
{
    name = loopName;
    // other stuff
}

Или более вероятно:

string name = null; // You need to set a value in case the collection is empty
foreach (string loopName in names)
{
    if (someCondition.IsTrueFor(loopName)
    {
        name = loopName;
        break;
    }
}

Если содержимое цикла foreach - это просто найти подходящий элемент, который, по крайней мере, кажется вероятным, тогда вам следует подумать, будет ли LINQ лучше соответствовать:

string name = names.Where(x => x.StartsWith("Fred"))
                   .FirstOrDefault();

Использование LINQ часто может создавать код, который в основном пытается найти что-то гораздо проще для чтения.

Ответ 2

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

Если вам нужно использовать индивидуальное имя из коллекции имен, вы можете присвоить его значению вне цикла foreach:

foreach(string name in names)
{
    if(name == someCondition)
        someVariable = name;
}

Ответ 3

Может быть,?

string name;
foreach (var tmp in names) { name = tmp; }