C# 填充字符数组或字符串-寻找更好的方法

C# 填充字符数组或字符串-寻找更好的方法,c#,printing,C#,Printing,我编写了一个非常简单的C代码,执行以下任务: 给定一个表示空间量的数字n,我的程序将打印沙漏: ***** *** * *** ***** 从命令窗口的左边界墙开始n空格 我的代码按预期工作,但非常混乱,没有条理,我相信有更好的方法,也许是以前由开发.NET Framework的microsoft开发人员用C#实现的 这是我的代码: public static void printAsterisk(int initialSpace) { int i, j; char[]

我编写了一个非常简单的C代码,执行以下任务:

给定一个表示空间量的数字
n
,我的程序将打印沙漏:

*****
 ***
  *
 ***
*****
从命令窗口的左边界墙开始
n
空格

我的代码按预期工作,但非常混乱,没有条理,我相信有更好的方法,也许是以前由开发.NET Framework的microsoft开发人员用C#实现的

这是我的代码:

public static void printAsterisk(int initialSpace)
{
    int i, j;
    char[] asteriskMsg = new char[5 * initialSpace + 25];
    for (i = 0; i < initialSpace; i++)
    {
        asteriskMsg[i] = ' ';
    }
    for (j = i; j < i + 5; j++)
    {
        asteriskMsg[j] = '*';
    }
    asteriskMsg[j] = '\n';
    for (i = j + 1; i < j + initialSpace + 1; i++)
    {
        asteriskMsg[i] = ' ';
    }
    for (j = i + 1; j < i + 4; j++)
    {
        asteriskMsg[j] = '*';
    }
    asteriskMsg[j] = '\n';
    for (i = j + 1; i < j + initialSpace + 3; i++)
    {
        asteriskMsg[i] = ' ';
    }
    asteriskMsg[i] = '*';
    asteriskMsg[i + 1] = '\n';
    for (j = i + 2; j < i + initialSpace + 3; j++)
    {
        asteriskMsg[j] = ' ';
    }
    for (i = j; i < j + 3; i++)
    {
        asteriskMsg[i] = '*';
    }
    asteriskMsg[i] = '\n';
    for (j = i + 1; j < i + initialSpace + 1; j++)
    {
        asteriskMsg[j] = ' ';
    }
    for (i = j; i < j + 5; i++)
    {
        asteriskMsg[i] = '*';
    }
    string s = new string(asteriskMsg);
    System.Console.Write("{0}", s);
}
我喜欢这个问题:)

这是我做这件事的方式。真的很期待别人,因为这真的很有趣:)

公共类程序
{
公共静态void Main(字符串[]args)
{
打印沙漏(25);
}
/// 
///从给定偏移量开始打印小时刻度
/// 
///起始偏移量
静态void打印沙漏(整数缩进)
{
PrintAsteriks(缩进,5);//偏移量=缩进,打印5*[I]*****
PrintAsteriks(缩进+1,3);//偏移量=缩进+1,打印3*[I]***
PrintAsteriks(缩进+2,1);//偏移量=缩进+3,打印1*[I]*
PrintAsteriks(缩进+1,3);//偏移量=缩进+1,打印3*[I]***
PrintAsteriks(缩进,5);//偏移量=缩进,打印5*[I]*****
}
/// 
///从给定偏移量开始打印给定数量的*字符
/// 
///起始偏移量
///要打印的*字符数
静态无效打印星号(整数缩进,整数星号)
{
//检查字符串的初学者指南。格式如下:
// https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110)。aspx启动
//字符串格式使用模板,允许您传入参数并根据需要设置参数格式。
//对于indent=25和asteriks=5,下面的模板计算结果为{0,25}{1}
//也就是说,
//打印参数0(第一个参数),无额外格式,将输出填充到25个字符
//打印参数1,无格式
字符串formatString=“{0,“+indent+”}{1}”;
//Console.WriteLine方法在内部使用string.Format
//下面,对于模板,参数0为null
//(因为我们只想打印25个字符,所以填充。
//该值可能是“”,而不是null)
//参数1是由*个字符组成的字符串,长度由asteriks参数指定
WriteLine(formatString,null,新字符串('*',星号));
//因此,它输出25个线性空格,然后输出5个*字符。
}
}

您是否熟悉所需的
new string()
重载
10*
例如,您可以执行
var fiveDelim=new string('*',5)恕我直言@Peter Duniho我不认为您标记的问题与此重复,这确实回答了问题。它询问如何打印给定n个级别的沙漏,而不一定只是如何重复指定次数的相同字符。奥里亚这是一把小提琴,我做了你想让它做的事。这不是我最优雅的作品,但我玩得很开心。请原谅格式问题,我在手机上写的,没有简单的缩进方法@ZacBraddy:如果OP想要整个问题的整个实现(即,对他们的代码进行全面重写),那么问题就太广泛了。问题的标题是“填充字符数组或字符串”,这显然与标记的问题重复。谢谢大家,我自己想出了一个聪明的解决方案(至少我认为是这样)。谢谢大家。那太好了,但我对C#很陌生。你能给我解释一下这是怎么回事吗?当然。我现在正在给源代码添加注释。@oria gruber完成了。谢谢!我还设法想出了一个解决办法。请检查编辑:)
public static void printAsterisk(int initialSpace)
{
    string firstRow = "*****", secondRow = "***", thirdRow = "*", firstRowSpaces = new string(' ', initialSpace), secondRowSpaces = new string(' ', initialSpace+1), thirdRowSpaces = new string(' ', initialSpace+2);
    string hourglass = string.Format("{0}{1}\n{2}{3}\n{4}{5}\n{2}{3}\n{0}{1}", firstRowSpaces, firstRow, secondRowSpaces, secondRow, thirdRowSpaces, thirdRow);
    System.Console.WriteLine(hourglass);
}
public class Program
{
    public static void Main(string[] args)
    {
        PrintHourGlass(25);
    }

    /// <summary>
    /// Prints an hour glass starting at the given offset
    /// </summary>
    /// <param name="indent">The starting offset</param>
    static void PrintHourGlass(int indent)
    {
        PrintAsteriks(indent, 5); // offset = indent, print 5 *          [I]*****
        PrintAsteriks(indent + 1, 3); // offset = indent + 1, print 3 *  [I] ***
        PrintAsteriks(indent + 2, 1); // offset = indent +3, print 1 *   [I]  *
        PrintAsteriks(indent + 1, 3); // offset = indent + 1, print 3 *  [I] ***
        PrintAsteriks(indent, 5); // offset = indent, print 5 *          [I]*****
    }

    /// <summary>
    /// Prints given number of * characters starting from the given offset
    /// </summary>
    /// <param name="indent">The starting offset</param>
    /// <param name="asterisks">The number of * characters to print</param>
    static void PrintAsteriks(int indent, int asterisks)
    {
        // Check starters guide to string.Format here:
        // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Starting

        // string format uses a template and allows you to pass in and format arguments as you like.
        // The template below evaluates to {0,25}{1} for indent = 25 and asteriks = 5
        // which means,
        // print argument 0 (first parameter), no extra formatting, pad the output to 25 characters
        // print argument 1, no formatting
        string formatString = "{0," + indent + "}{1}";

        // Console.WriteLine method uses string.Format internally
        // Below, for the template, argument 0 is null
        //     (since we want to print only 25 characters, the padding.
        //     The value could have been "" instead of null)
        // Argument 1 is a string of * characters, with the length specified by asteriks parameter
        Console.WriteLine(formatString, null, new string('*', asterisks));

        // Therefore, it outputs 25 linear white spaces, then 5 * characters.
    }
}