我有一个有效的代码,但我怎样才能让它更优雅
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);
以下是一些可能的改进:
您可以创建一个已经包含所需数量的重复字符的字符串,而不是单独输出相同的字符:new string(Ch, Count);
.
要使用空格缩进字符串,您可以使用 .PadLeft(Count)
.
要在字符串中的字符之间插入空格,您可以使用 string.Join(" ", characters.ToCharArray())
.
同时避免代码重复。如果您发现某些代码重复,请尝试提取并重新使用它,例如,请参见下面的 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();
}
只是它以标题格式写入字符串值并居中,但是有没有一种方法可以减少 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);
以下是一些可能的改进:
您可以创建一个已经包含所需数量的重复字符的字符串,而不是单独输出相同的字符:
new string(Ch, Count);
.要使用空格缩进字符串,您可以使用
.PadLeft(Count)
.要在字符串中的字符之间插入空格,您可以使用
string.Join(" ", characters.ToCharArray())
.同时避免代码重复。如果您发现某些代码重复,请尝试提取并重新使用它,例如,请参见下面的
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();
}