有没有一种简单的方法在C#中创建多行字符串文字?
这就是我现在拥有的:
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
我知道PHP有
<<<BLOCK
BLOCK;
C#有类似的东西吗?
如果您不想要空格/换行符,则字符串添加似乎有效:
var myString = String.Format(
"hello " +
"world" +
" i am {0}" +
" and I like {1}.",
animalType,
animalPreferenceType
);
// hello world i am a pony and I like other ponies.
如果你愿意,你可以运行上面的here。
您可以使用以下两种方法:
private static String ReverseString(String str)
{
int word_length = 0;
String result = "";
for (int i = 0; i < str.Length; i++)
{
if (str[i] == ' ')
{
result = " " + result;
word_length = 0;
}
else
{
result = result.Insert(word_length, str[i].ToString());
word_length++;
}
}
return result;
}
//NASSIM LOUCHANI
public static string SplitLineToMultiline(string input, int rowLength)
{
StringBuilder result = new StringBuilder();
StringBuilder line = new StringBuilder();
Stack<string> stack = new Stack<string>(ReverseString(input).Split(' '));
while (stack.Count > 0)
{
var word = stack.Pop();
if (word.Length > rowLength)
{
string head = word.Substring(0, rowLength);
string tail = word.Substring(rowLength);
word = head;
stack.Push(tail);
}
if (line.Length + word.Length > rowLength)
{
result.AppendLine(line.ToString());
line.Clear();
}
line.Append(word + " ");
}
result.Append(line);
return result.ToString();
}
在Split Line Multiline()中,您需要定义要使用的字符串和行长度,这非常简单。谢谢 。
它在C#中被称为verbatim string literal,它只是在文字之前放置@的问题。这不仅允许多行,而且还会关闭转义。例如,您可以这样做:
string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";
逃脱的唯一一点是,如果你想要一个双引号,你必须添加一个额外的双引号符号:
string quote = @"Jon said, ""This will work,"" - and it did!";
另一个需要注意的是在string.Format中使用字符串文字。在这种情况下,您需要转义花括号/括号'{'和'}'。
// this would give a format exception
string.Format(@"<script> function test(x)
{ return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x)
{{ return x * {0} }} </script>", aMagicValue)
我发现使用字符串文字的问题是它可以使你的代码看起来有点“怪异”,因为为了不在字符串本身中获取空格,它必须完全左对齐:
var someString = @"The
quick
brown
fox...";
呸。
因此,我喜欢使用的解决方案是:它使所有代码与其余代码保持良好对齐:
var someString = String.Join(
Environment.NewLine,
"The",
"quick",
"brown",
"fox...");
当然,如果你只是想像你一样逻辑地分割SQL语句的行并且实际上不需要换行,你总是可以用Environment.NewLine
替换" "
。
作为附注,使用C#6.0,您现在可以将插值字符串与逐字字符串文字组合:
string camlCondition = $@"
<Where>
<Contains>
<FieldRef Name='Resource'/>
<Value Type='Text'>{(string)parameter}</Value>
</Contains>
</Where>";
为什么人们会将字符串与字符串文字混淆?接受的答案是对不同问题的一个很好的答案;不是这个。
我知道这是一个古老的话题,但我来到这里可能和OP一样,并且看到人们如何误读它是令人沮丧的。或许我误解了它,我不知道。
粗略地说,字符串是计算机存储器的一个区域,在执行程序期间,它包含可以映射到文本字符的字节序列。另一方面,字符串文字是一段尚未编译的源代码,它表示稍后在执行出现的程序期间初始化字符串的值。
在C#中,声明......
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
......不会产生三线串而是一根线;三个字符串的串联(每个字符串从不同的字面值初始化),其中没有一个字符串包含换行符。
OP似乎要问的是 - 至少我会问这些话 - 不是如何在编译的字符串中引入模仿源代码中找到的换行符,而是如何分解清晰度很长,源代码中的单行文本,不会在编译的字符串中引入中断。并且不需要延长执行时间,花费加入来自源代码的多个子串。就像javascript或C ++中多行字符串文字中的尾部反斜杠一样。
建议使用逐字字符串,永远不要使用字符串反转来查找StringBuilder
s,String.Join
s甚至嵌套函数,哪些不是,这让我觉得人们并没有真正理解这个问题。或许我不明白。
据我所知,C#没有(至少在我使用的旧石器时代版本中,从前十年开始)有一个功能可以干净地生成多行字符串文字,可以在编译期间解决而不是执行。
也许当前版本支持它,但我想我会分享我在字符串和字符串文字之间感知的差异。
我没有看到这个,所以我会在这里发布它(如果你有兴趣传递一个字符串,你也可以这样做。)这个想法是你可以在多行上打破字符串并添加你自己的内容(也在多条线上)以任何你想要的方式。这里“tableName”可以传递给字符串。
private string createTableQuery = "";
void createTable(string tableName)
{
createTableQuery = @"CREATE TABLE IF NOT EXISTS
["+ tableName + @"] (
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[Key] NVARCHAR(2048) NULL,
[Value] VARCHAR(2048) NULL
)";
}
你可以使用@和“”。
string sourse = @"{
""items"":[
{
""itemId"":0,
""name"":""item0""
},
{
""itemId"":1,
""name"":""item1""
}
]
}";
是的,您可以将字符串拆分为多行而不在实际字符串中引入换行符,但它不是很好:
string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";
诀窍是引入评估为空的代码,并且该代码可能包含换行而不影响输出。我将这种方法从this answer改编为类似的问题。
关于问题是什么显然有些混乱,但有两个提示,我们在这里想要的是一个不包含任何换行符的字符串文字,其定义跨越多行。 (在评论中他这么说,“这就是我所拥有的”显示的代码不会创建带有换行符的字符串)
此单元测试显示了意图:
[TestMethod]
public void StringLiteralDoesNotContainSpaces()
{
string query = "hi"
+ "there";
Assert.AreEqual("hithere", query);
}
更改上面的查询定义,使其为一个字符串文字,而不是两个字符串文字的串联,这两个字符串文字可能会也可能不会被编译器优化为一个。
C ++方法是用反斜杠结束每一行,导致换行符被转义而不会出现在输出中。不幸的是,仍然存在这样的问题:第一行之后的每一行必须保持对齐,以便不向结果添加额外的空格。
只有一个选项不依赖于可能不会发生的编译器优化,即将您的定义放在一行上。如果你想依赖编译器优化,你已经拥有的+很棒;你不必左对齐字符串,你不会在结果中得到换行符,只是一个操作,没有函数调用,以期望优化。