Использовать C# 8 индексов и диапазонов - PullRequest
3 голосов
/ 05 августа 2020

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

Я должен сделать строку похожей на: (123) 456-7890 (входной массив гарантированно имеет правильную длину).

Я узнал о новых индексах и диапазонах C# и попробовал что-то вроде этого:

public static string GenerateOutput(int[] numbers)
{
    return $"({numbers[0..2]}) {numbers[3..5]}-{numbers[6..9]}";
}

Но это не дает желаемого результата. Как преобразовать их в строки и вернуть правильный результат?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Было бы гораздо полезнее, если бы ваши числа были строкой, чтобы их можно было ранжировать напрямую:

var s = string.Join("", numbers);

Теперь вы можете сократить строку, используя диапазоны:

var ph = $"(s[..3]}) {s[3..6]}-{s[^4..]}";
3 голосов
/ 05 августа 2020

Основная проблема заключается в том, что вы помещаете массивы внутри строки. ToString() в массиве приведет к строке, описывающей тип, а не к строке его значений. Вам необходимо объединить эти массивы. Вы можете создать локальную функцию, чтобы ее было удобнее использовать:

string getNums (int start, int end) =>
    string.Join("", numbers[start..end]);

В остальном ваша индексация включается с обеих сторон. Но согласно Microsoft :

Диапазон определяет начало и конец диапазона. Диапазоны являются исключительными, то есть конец не входит в диапазон.

Исключение означает не это. c -sharpcorner делает это лучше:

Оператор Range .. определяет начало (включающее) и конец (исключение) диапазона.

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

Тем не менее, имея это в виду, вы можете реализовать локальную функцию следующим образом:

var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

string getNums (int start, int end) =>
    string.Join("", numbers[start..end]);

return $"({getNums(0,3)}) {getNums(3,6)}-{getNums(6,10)}";
...