Определить, заканчивается ли строка с одним из нескольких предложенных вариантов


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

Я уверен, что это можно написать более элегантно, вероятно, избегая контура.

bool EndsWithOneOf(string value, IEnumerable<string> suffixes)
{ 
    foreach(var suffix in suffixes)
    {
        if value.EndsWith(suffix)
            return true;
    }
    return false;
}


6891
5
задан 18 августа 2011 в 05:08 Источник Поделиться
Комментарии
5 ответов

Вы можете LINQify его для улучшения читабельности:

bool endsWithOneOf = suffixes.Any(x => value.EndsWith(x));

Обратите внимание, что это не "избежать петли", так как любой() будет перебирать суффиксы (остановки, когда она попадает на матч.) Но это нормально, так как еще могли бы вы сделать это? Перечисление суффиксов, поэтому с ними ничего делать, вы должны перечислить их.

15
ответ дан 18 августа 2011 в 05:08 Источник Поделиться

bool EndsWithOneOf(string value, IEnumerable<string> suffixes)
{
return suffixes.Any(suffix => value.EndsWith(suffix));
}

Редактировать: слишком поздно :Д

Обновление

Мой предыдущий ответ был дан несколько раз, но это тоже работает. С помощью группового метода:

bool EndsWithOneOf(string value, IEnumerable<string> suffixes)
{
return suffixes.Any(value.EndsWith);
}

11
ответ дан 18 августа 2011 в 05:08 Источник Поделиться

static bool EndsWithOneOf(this string value, IEnumerable<string> suffixes)
{
return suffixes.Any(suffix => value.EndsWith(suffix));
}

Здесь два преимущества:


  1. использование метода расширения делает вызов этого метода более прямой
    вперед (т. е. например.EndsWithOneOf(mySuffixes);)

  2. Использовать LINQ позволяет для лучшей читаемости (см. декларационный
    против императивное Программирование)

4
ответ дан 18 августа 2011 в 05:08 Источник Поделиться

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

Что вы можете сделать, - это сделать метод более лаконична, используя метод в LINQ:

return suffixes.Any(s => value.EndsWith(s));

Но что больше читается, чем:

foreach (string suffix in suffixes) {
if (value.EndsWith(suffix)) return true;
}
return false;

Для фактического метода улучшения, следует рассмотреть спор проверки. Что произойдет, если значение является нулем? Ваш текущий код будет возвращать в исключение NullReferenceException.

Behaviourly правильно ли будет бросить исключение ArgumentNullException в этом случае? Или это возможно нулевое значение автоматического результирующее значение false?

Вы также должны рассмотреть, как ваши сравниваете строки? Вы должны обеспечить перегрузку, которая позволяет абоненту перейти в соответствующее свойство объекта? Или, возможно, укажите параметр stringcomparison?

3
ответ дан 18 августа 2011 в 05:08 Источник Поделиться

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

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

Е. Г. ".ПНГ.формат JPG.БМП.мова.МР3"..содержит(myFileExtension + ".");

Я использовал этот подход несколько раз, чтобы распутать петли.

1
ответ дан 23 августа 2011 в 06:08 Источник Поделиться