使用 C# 8 索引和范围

Utilize C# 8 indices and ranges

我正在尝试以有效的方式解决在线挑战。给定一个 int.

数组,我必须基本上以某种格式输出一个字符串

我必须使字符串看起来像:(123) 456-7890(保证输入数组的长度正确)。

我发现了新的 C# 索引和范围并尝试了这样的事情:

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

但这并不是 return 想要的结果。如何将它们转换为字符串并 return 正确输出?

主要问题是您将数组放入字符串中。数组上的 ToString() 将产生描述类型的字符串,而不是其值的字符串。您需要连接这些数组。可以创建一个本地函数,使用起来更方便:

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

除此之外,您的索引在两端都包含在内。但是根据 Microsoft:

A range specifies the start and end of a range. Ranges are exclusive, meaning the end isn't included in the range.

这不是排他性的意思。 c-sharpcorner 说得更好:

The Range operator .. specifies the start (Inclusive) and end (exclusive) of a 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)}";

如果您的数字是一个字符串,那么它们会更有用,这样它们就可以直接排列:

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

现在您可以使用范围来剪切字符串:

var ph = $"(s[..3]}) {s[3..6]}-{s[^4..]}";