Проверка в D, если строка находится в массиве? - PullRequest
4 голосов
/ 30 мая 2009

Как проверить наличие строки в массиве? Я имею в виду, конечно, я могу зациклить, но есть ли стандартная функция?

сначала я сделал:

if(str in ["first", "second", "third"])

но он жаловался, что in работает только с ассоциативными массивами.

Я попытался быстро просмотреть документы Phobos, но не нашел ни одного модуля, связанного с массивами.

Так есть что-нибудь, или я просто должен пройти через это вручную?

Edit:

Я на D1, Фобос.

Ответы [ 2 ]

6 голосов
/ 30 мая 2009

Если ваши строки постоянны (как в примере), вы можете использовать литерал ассоциативного массива, но синтаксис не очень приятный:

if (str in ["first"[]:0, "second":0, "third":0])

Я не думаю, что есть вызов библиотеки, который вы можете использовать в D1 Phobos, но алгоритм D2 std.algorithm имеет то, что вы могли бы использовать:

if (count(["first", "second", "third"][], str))

В Tango вы можете использовать общую функцию contains из tango.text.Util:

if (contains(["first", "second", "third"][], str))

Обратите внимание, что [] в конце литералов массива требуется, потому что нам нужно передать фрагмент памяти статического массива, а не фактическое значение статического массива по значению.

4 голосов
/ 30 мая 2009

С D1 Phobos вам придется делать это самостоятельно. Но это не так уж сложно.

bool contains(T)(T[] a, T v)
{
    foreach( e ; a )
        if( e == v )
            return true;
    return false;
}

Кроме того, вы можете использовать его следующим образом:

auto words = ["first"[], "second", "third"];
if( words.contains(str) ) ...

Надеюсь, это поможет.

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

size_t indexOf(T)(T[] a, T v)
{
    foreach( i, e ; a )
        if( e == v )
            return i;
    return a.length;
}
...