多行字符串中的换行符

9
尝试在我的一个类中重写tostring方法。
 return string.Format(@" name = {0}
                         ID = {1}
                         sec nr = {2}
                         acc nr = {3}", string, int, int ,int); // types

但问题在于,打印出来的结果没有对齐:
name = test
                                   ID = 42
                                   sec nr = 11
                                   acc nr = 55

尝试添加 \n 只会将其打印出来而不进行格式化。猜测这与我用于多行的 @"" 有关。

希望它能打印出:

name = test
ID = 42
sec nr = 11
acc nr = 55
5个回答

14

如果在前面加上空格,输出时会按照这种方式打印。

我通常是这样做的。

   return string.Format(
@" name = {0}
 ID = {1}
 sec nr = {2}
 acc nr = {3}", string, int, int ,int); // types

更新:也许有一个更好看的替代方案:

string[] lines = 
{
  " name = {0}",
  " ID = {1}",
  " sec nr = {2}",
  " acc nr = {3}"
};

return string.Format(
         string.Join(Environment.Newline, lines), 
         arg0, arg1, arg2, arg3);

2
那个方案可行,所以它是一个解决方案,但是没有缩进的代码看起来很丑陋。有没有更好的方法? - Milan
1
@Zka:不是很好,那基本上就是你能得到的最好的了 :( - leppie
1
谢谢提供这个替代方案,看起来更好,对我的需求来说非常可行。 - Milan
另一种选择是将常量从代码中重构到资源文件中。这样做的额外好处是可以轻松地实现多语言翻译。 - Dan Bechard

6

@符号在字符串前面关闭了标准的C#字符串格式化,试试看

 return string.Format(" name = {0}\n ID = {1} \n sec nr = {2} \n acc nr = {3}", 
                      string, int, int ,int); // types

您不能同时使用@和\n、\t等符号。

编辑

在我看来,这已经是最好的了。

 return string.Format("name = {0}\n" + 
                      "ID = {1}\n" + 
                      "sec nr = {2}\n" + 
                      "acc nr = {3}", 
                       string, int, int ,int); 

实际上,是的,那个方法可以用,但我真的需要它变成多行,因为还有更多的信息需要添加,使得这一行非常长。 - Milan
@leppie:抱歉,为什么不支持Windows? - Binary Worrier
"\n"不是Windows上的标准换行符。我知道有些控件在获取"\n\r"之前是无法正常工作的。 - leppie
@leppie:谢谢,我主要是服务器端的,所以没有注意到。 - Binary Worrier

4
来自 MSDN 的解决方案:
// Sample for the Environment.NewLine property
using System;

class Sample 
{
    public static void Main() 
    {
    Console.WriteLine();
    Console.WriteLine("NewLine: {0}  first line{0}  second line{0}  third line",
                          Environment.NewLine);
    }
}
/*
This example produces the following results:

NewLine:
  first line
  second line
  third line
*/

有趣,我从未想过那个 - Brian White
对于.NET Fiddle或LinqPad来说,这是绝佳的答案。 - Marcelo Scofano Diniz

1
String.Join(Environment.NewLine, value.Select(i => i)

其中values是字符串集合


0

不,这是你里面所有的空格。


+1 已中和。这个答案有什么问题吗?我承认它更像是一个原因而不是一个解决方案。 - Amsakanna
是的,应该对这个答案多付出一些努力。我的过失。 - ben

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