子串插值

Substring interpolation

是否可以对字符串的子字符串进行字符串插值格式化?

我一直在搜索有关字符串插值的 Microsoft 文档,但无法完成工作示例。 reference.

目前我有:

var description = "the quick brown fox";
var result = $"{description.Substring(0, description.Length < 10 ? description.Length : 10)} jumps..",

使用字符串插值我最想使用:

var description = "the quick brown fox";
var result = $"{description:10} jumps..",

已编辑

我希望结果的输出是:

The quick  jumps..

可以使用方法:

description.Take(10)

不幸的是,此方法 returns IEnumerable 无法直接转换为字符串(ToString 方法在 IEnumerable 上使用时通常会 return 类型名称)。 您不能使用它创建字符串,因为字符串构造函数需要字符数组,所以最简单的解决方案是:

new string(description.Take(10).ToArray())

不过,这样的代码如果你想多次使用它会更难阅读,所以你可以创建扩展方法:

public static string TakeFirst(this string text, int number)
{
    if (text == null)
        return null;

    return new string(text.Take(number).ToArray());
}

那你就可以直接用了:

$"{description.TakeFirst(10)} jumps..";

编辑:如评论中所述,由于每次调用此方法时都会分配数组,因此可能会出现严重的性能问题。您可以通过使用 Substring 而不是 Take(x).ToArray() 解决方案实现 TakeFirst 方法来避免它们。

问题是:
"Is it possible to do a string interpolation formatting a substring of a string?"
以这样的方式:

var result = $"{description:10} jumps..",

@JohnSkeet 和@JeroenMostert 给出的答案最准确:
"No, it is not possible."

有多种方法可以简化调用。感谢@PiotrWojsa 指出这一点。然而,这不涉及插值部分..

您可以使用 ranges (C# 8):

var description = "the quick brown fox";
var result = $"{description[..10]} jumps..";