我有一个有效的代码,但我怎样才能让它更优雅

I have a code which works but how can ı make it more elegant

只是它以标题格式写入字符串值并居中,但是有没有一种方法可以减少 for 循环的使用或使用嵌套的 for 循环并为空格编写一个函数,这样我就不必将相同的东西写 3 次 (音乐仅供娱乐) (如果我的英语很难理解,请原谅我)

static void Main(string[] args)
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer();
            player.SoundLocation = @"C:\Users\win7\Desktop\Sarper.wav";
            player.Play();
            Console.WriteLine("******** Make a Title ********");
            Console.WriteLine();
            Console.Write("Title : ");
            char[] characters= Console.ReadLine().ToUpper().ToCharArray();
            int spaces = 40 - characters.Length;

            

            
            for (int b = 0; b < spaces; b++)
            {
                Console.Write(" ");
            }
            for (int j = 0; j < characters.Length * 2 - 1; j++)
            {
                Console.Write("-");
            }
            Console.WriteLine();
            for (int b = 0; b < spaces; b++)
            {
                Console.Write(" ");
            }
            for (int j = 0; j < characters.Length; j++)
            {
                Console.Write(characters[j] + " ");
            }
            Console.WriteLine();
            for (int b = 0; b < spaces; b++)
            {
                Console.Write(" ");
            }
            for (int j = 0; j < characters.Length * 2 - 1; j++)
            {
                Console.Write("-");
            }






            Console.Read();
        }

这是我的版本:更少的重复,更少的垃圾创建(没有字符串立即被丢弃,没有 char[] 无缘无故)。尽管为了清楚 for 循环,我确实使用了 String.Join 。一个可能的缺点是 title 最终输入的标题会被隔开,如果以后需要的话,这可能是不可取的。

Console.WriteLine("******** Make a Title ********");
Console.WriteLine();
Console.WriteLine("Title : ");
var title = String.Join(' ', Console.ReadLine().Select(ch => ch.ToUpper()));
var spaces = new String(' ', 40 - title.Length);
var dashes = new String('-', title.Length);

void WriteSpacedLine(string s) {
    Console.Write(spaces);
    Console.WriteLine(s);
}

WriteSpacedLine(dashes);
WriteSpacedLine(title);
WriteSpacedLine(dashes);

这是一个(稍微)更短的版本,它不太关心垃圾并且(也许)更容易理解:

Console.WriteLine("******** Make a Title ********");
Console.WriteLine();
Console.WriteLine("Title : ");
var title = String.Join(' ', Console.ReadLine().ToUpper().ToCharArray());
var dashes = new String('-', title.Length);

void WriteSpacedLine(string s) => Console.WriteLine(s.PadLeft(40));

WriteSpacedLine(dashes);
WriteSpacedLine(title);
WriteSpacedLine(dashes);

请注意此代码执行原始代码的操作,并没有尝试居中任何内容,它实际上是对 40 个字符位置的右对齐。

此代码以第 40 列为中心:

Console.WriteLine("******** Make a Title ********");
Console.WriteLine();
Console.WriteLine("Title : ");
var title = String.Join(' ', Console.ReadLine().ToUpper().ToCharArray());
var indent = 40 + title.Length / 2;
var dashes = new String('-', title.Length);

void WriteSpacedLine(string s) => Console.WriteLine(s.PadLeft(indent));

WriteSpacedLine(dashes);
WriteSpacedLine(title);
WriteSpacedLine(dashes);

以下是一些可能的改进:

  1. 您可以创建一个已经包含所需数量的重复字符的字符串,而不是单独输出相同的字符:new string(Ch, Count);.

  2. 要使用空格缩进字符串,您可以使用 .PadLeft(Count).

  3. 要在字符串中的字符之间插入空格,您可以使用 string.Join(" ", characters.ToCharArray()).

  4. 同时避免代码重复。如果您发现某些代码重复,请尝试提取并重新使用它,例如,请参见下面的 divider 变量。

这里是代码的优化版本:

   static void Main(string[] args)
   {
    var player = new System.Media.SoundPlayer { SoundLocation = @"C:\Users\win7\Desktop\Sarper.wav" };
    player.Play();

    Console.WriteLine("******** Make a Title ********" + Environment.NewLine);
    
    Console.Write("Title : ");
    var characters = Console.ReadLine().ToUpper();

    var spaces = 40 - characters.Length;
    var divider = new string('-', characters.Length * 2 - 1).PadLeft(spaces);
    Console.Write(divider + Environment.NewLine +
                  string.Concat(characters.Select(ch => ch + " ")).PadLeft(spaces) + Environment.NewLine +
                  divider);

    Console.Read();
   }