C# 在C语言中缩进未缩进代码的应用程序#

C# 在C语言中缩进未缩进代码的应用程序#,c#,string,whitespace,indentation,C#,String,Whitespace,Indentation,我的应用程序应该读取一个C#code样本,该样本是未插入的,然后以编程方式缩进代码。我的做法可能不正确,但仍可能取得部分成果 我可以在找到{时设置空格,然后继续为正在读取的其余行保留相同的空间。当再次找到另一个{时,添加空格并继续为其余行保留此新空间。为此,我做了以下操作: private void btn_format_Click(object sender, EventArgs e) { string lineInfo = ""; string

我的应用程序应该读取一个C#code样本,该样本是未插入的,然后以编程方式缩进代码。我的做法可能不正确,但仍可能取得部分成果

我可以在找到
{
时设置空格,然后继续为正在读取的其余行保留相同的空间。当再次找到另一个
{
时,添加空格并继续为其余行保留此新空间。为此,我做了以下操作:

    private void btn_format_Click(object sender, EventArgs e)
    {
        string lineInfo = "";
        string fl = "";
        string ctab= char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32);
        foreach (string line in txt_codepage.Lines) // text_codepage is a textbox with code
        {
            if (line.Contains("{"))
            {
                string l = line.Replace("{", ctab+"{");
                lineInfo = lineInfo + (l + "\n");
                fl = fl + ctab;
                ctab = ctab + ctab;
            }
            else
            {
                lineInfo = lineInfo + (char.ConvertFromUtf32(32)+fl+ line + "\n");
            }
在此之前,我可以实现我想要的正确缩进。现在,当我找到一个
}
时,我应该执行相反的过程,但不幸的是,这对于字符串是不可能的。我的意思是,相反的过程是:

            if (line.Contains("}"))
            {
                string l = line.Replace(ctab + "}", "}");
                lineInfo = lineInfo + (l + "\n");
                fl = fl - ctab;
                ctab = ctab - ctab;
            }
            else
            {
                lineInfo = lineInfo - (char.ConvertFromUtf32(32) + fl + line + "\n");

            }
        }
        MessageBox.Show(lineInfo.ToString());

我知道代码的上述部分完全是一个错误,但请告诉我如何以正确的方式实现它

使用String.Trim()删除行中的所有空白,然后只添加所需的制表符。此外,如果可以避免char.ConvertFromUtf32(32),那么代码的可读性会更好-为什么要编写它而不是“”或者“”?

你可以去看看,一个开源VS插件,用于清理代码

如果你想解析字符串,你应该使用StringBuilder而不是字符串连接(连接会变慢)。我写了一些代码,来演示如何解析CS或其他代码。这不是一个完整的示例,只是一个基本概念

如果您想了解有关解析器的更多信息,可以阅读

公共静态字符串缩进CSharpCode(字符串代码)
{
const string INDENT\u STEP=“”;
if(string.IsNullOrWhiteSpace(代码))
{
返回码;
}
var result=新的StringBuilder();
var indent=string.Empty;
var lineContent=false;
var stringDefinition=false;
对于(变量i=0;i
Visual Studio内置了这种自动缩进功能。您是否检查过它是否在API中公开了功能?
char.ConvertFromUtf32(32)
用于打印一个空格。由于我不想使用添加8个空格的\t,我创建了一个包含3个空格的字符串变量。对,忘记了我的ascii值,也没有编译器。这个(更新的)问题仍然存在。
public static string IndentCSharpCode(string code)
{
    const string INDENT_STEP = "    ";

    if (string.IsNullOrWhiteSpace(code))
    {
        return code;
    }

    var result = new StringBuilder();
    var indent = string.Empty;
    var lineContent = false;
    var stringDefinition = false;

    for (var i = 0; i < code.Length; i++)
    {
        var ch = code[i];

        if (ch == '"' && !stringDefinition)
        {
            result.Append(ch);
            stringDefinition = true;
            continue;
        }

        if (ch == '"' && stringDefinition)
        {
            result.Append(ch);
            stringDefinition = false;
            continue;
        }

        if (stringDefinition)
        {
            result.Append(ch);
            continue;
        }

        if (ch == '{' && !stringDefinition)
        {
            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("{");

            if (lineContent)
            {
                result.AppendLine();
            }

            indent += INDENT_STEP;
            lineContent = false;

            continue;
        }

        if (ch == '}' && !stringDefinition)
        {
            if (indent.Length != 0)
            {
                indent = indent.Substring(0, indent.Length - INDENT_STEP.Length);
            }

            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("}");

            if (lineContent)
            {
                result.AppendLine();
            }


            lineContent = false;

            continue;
        }

        if (ch == '\r')
        {
            continue;
        }

        if ((ch == ' ' || ch == '\t') && !lineContent)
        {
            continue;
        }

        if (ch == '\n')
        {
            lineContent = false;
            result.AppendLine();

            continue;
        }

        if (!lineContent)
        {
            result.Append(indent);
            lineContent = true;
        }

        result.Append(ch);
    }

    return result.ToString();
}