Цикл по коллекции


В ситуации, когда я цикл по коллекции ищу предмет, лучше практика, чтобы сломать , прежде чем я вернуться или я должен сломать и потом вернуться?

Возврат в течение цикла:

foreach(string item in items)
{
    string[] split = item.Split('|');
    if(split[0] == searchFor)
        return split[1];
}
return null;

Перерыв, затем вернуться:

string result = null;
foreach(string item in items)
{
    string[] split = item.Split('|');
    if(split[0] == searchFor)
    {
        result = split[1];
        break;
    }
}
return result;


12304
14
задан 29 апреля 2011 в 07:04 Источник Поделиться
Комментарии
10 ответов

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

18
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

Часто, конкретные проблемы и диктует решения.


  • Возврат сразу, можно сэкономить уровней вложенности условий, что значительно повышает удобочитаемость кода.

  • Жду до конца позволяет проще лесозаготовки, а иногда и проще отладка.

  • Если есть нетривиальная вероятность, что вы захотите добавить дополнительные логические функции позже, тогда не вернуться до конца.

4
ответ дан 1 мая 2011 в 10:05 Источник Поделиться

Рекомендуется вернуться как можно раньше. Первый пример-это понятнее для чтения, и вы не таскаю переменной вы на самом деле не нужны.

3
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

Эммм... использовать LINQ?

return items.Select(item => item.Split('|'))
.Where(split => (split[0] == searchFor))
.Select(split => split[1])
.FirstOrDefault();

или

searchFor += "|";
return items.Where(item => (item.StartsWith(searchFor)))
.Select(item => item.Substring(searchFor.Length))
.FirstOrDefault();

Кстати второй реализации-около 17% быстрее, чем явный цикл ОП.

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

2
ответ дан 23 ноября 2013 в 01:11 Источник Поделиться

Что лучше-это довольно субъективно и зависит от контекста.

Но...ваш код выглядит, как это тело процедуры, которая выглядит следующим...

public string Search(string searchFor, IEnumerable<string>items){
foreach(string item in items) {
string[] split = item.Split('|');
if(split[0] == searchFor)
return split[1];
}
return null;
}

Это весьма распространенный, но ИМО тоже совершенно неправильно. Возвращая значение NULL , если значение не найдено, вы даете два смысловых (и совершенно противоположные) значения возвращаемое значение: значение, и значение не найдено.

public boolean TrySearch(string searchFor, IEnumerable<string>items, 
out string stringFound){
stringFound=null;
foreach(string item in items) {
string[] split = item.Split('|');
if(split[0] == searchFor){
stringFound=split[0];
return true;
}
}
return false;
}

Гораздо безопаснее и понятнее, потому что он позволяет абоненту знать, что возвращаемое значение может или не может быть полезной и призывает проверить на нуль.

1
ответ дан 23 ноября 2013 в 03:11 Источник Поделиться

Нет, главное отличие, и насколько я могу судить никаких реальных преимуществ использования одного или другого, кроме удобочитаемости, пуризм.

Проверить эту цитату я нашел:


Истинные пуристы скажут, что функция
должен иметь только одну запись (в
вершина) и выход (внизу)
точка.

Действительно, он получает от того или нет
вы хотите продолжить выполнение ваших
код после определенного условии цикла
произошло. Те, которые используют возвращает
в цикле (и я виноват
иногда использование себя) просто хочу
быстрый способ выхода из функции без
написание дополнительной логики для поддержки
"единый выход" философия.

Помню, у них есть разные
целей, как не только выйти из
петли, что вы находитесь в НО выполнения
функция продолжается.

0
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

Я вернусь сразу, оно более прямое и более ясным. Вам не нужно, чтобы добавить дополнительную переменную и меньше возможность ошибиться.

0
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

Если вы знаете, что это конец функции, то все средства вернутся. Нет СВАО, чтобы сделать единую точку выхода. Это старый школьный бред.

0
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

Я думаю, что нет "лучшей практики" на этом - вы найдете людей, которые поддерживают обе возможности.

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

0
ответ дан 29 апреля 2011 в 07:04 Источник Поделиться

На этом тривиальном примере, это вряд ли имеет значение, но если функция была намного сложнее было бы больше смысла в том, чтобы как можно быстрее вернуться, обработка какой-либо деятельности по очистке в блоке finally.

Оппортунистические возвращение-это важная практика для избежания стрелка анти-паттерн (см. Метод № 4 описано в этой статье). Используя конъюнктурный подход позволит вам преобразовать вложенные ИФС в параллельные/прогрессивные IFS и ворот, что снижает цикломатическая сложность и (вполне устоялась) вероятность логических ошибок.

0
ответ дан 23 ноября 2013 в 03:11 Источник Поделиться