嵌套字符串插值

5

我在C# 6中遇到了嵌套字符串插值的问题。

例如,有一个字符串:

string test = "StartText MiddleText1 MiddleText2 EndText";

如果我只想对MiddleText1应用ToUpper()方法,可以这样做:
string test = $@"StartText {"MiddleText1".ToUpper()} MiddleText2 EndText";

但是如果我想对字符串的某一部分应用字符串方法,例如Replace(),该怎么办呢?

{"Middletext1".ToUpper()} MiddleText2

我期望像这样的东西能够工作:

string test = $@"StartText {"{"MiddleText1".ToUpper()} MiddleText2".Replace("x", "y")} EndText";

但是这个语法是错误的 - 我试过很多变化,尝试过引号但是我没能得到正确的语法。我希望不需要将字符串拆分成不同的部分。有没有一种只使用插值功能就可以解决的方法?


3
这里简单说一下... string test = $@"开头文字 {$"{"中间文字1".ToUpper()} 中间文字2".Replace("x", "y")} 结尾文字"; ... 话虽如此,这看起来实在是太难读了,而且真的违背了字符串插值的初衷。 - Glorin Oakenfoot
4
停止试图在一行中完成所有事情,如果你把它分开,你就会知道问题所在。 - TheGeneral
谢谢Glorin,好棒的一击。你能否提供另一种方式来完成这个任务,而不需要使用中间变量以避免代码可读性差的问题? - Vladimir
1个回答

12

停止试图在一行中完成所有内容是我的建议

以下是答案

var middle = "MiddleText1";
middle = middle.ToUpper();

var middle2 = $"{middle} MiddleText2";
middle2 = middle2.Replace("x", "y");

string test = $"StartText {middle2} EndText";

把所有东西加在一起后,就成了这个。

string test = $"StartText {$"{"MiddleText1".ToUpper()} MiddleText2".Replace("x", "y")} EndText";

简而言之,你只是缺少了一个 $

然而,即使这样也有些混乱,因为我不确定所有的替换都是用来干什么的,这个文本从哪里来,以及你试图解决的问题是什么。


这是一个不错的方法,但原始文本很长,我需要进行许多类似的方法调用,这就是为什么我尝试寻找一行解决方案以避免创建大量额外变量的原因。 - Vladimir
1
@Vladimir,这很公平,但是你只是缺少了一个 $ - TheGeneral
实际上,这个问题来自于使用某种“HTML页面构建器”的工作。它使用字符串扩展方法从一些文本中创建HTML页面,返回嵌入在不同HTML标记中的内部字符串。例如,它将返回一些部分在<td>标记中,然后结果嵌入在<tr>中,然后结果在<table>标记中等等。现在我发现这将非常难以阅读。也许你可以建议另一种方法? - Vladimir
谢谢,我会尝试使用它! - Vladimir
1
@Vladimir:通常,将许多操作挤入一行中所得到的唯一结果就是可怕的调试时间。因为你无法确定这3-10个操作中哪一个甚至导致了问题。不要过于担心性能。JiT在削减死代码和在发布版本中添加/删除临时变量以提高性能方面做得很好。 - Christopher
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接