You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将字符串作为代码初始化另一个字符串?

Advent of Code 2015 第8题:字符串转义长度差值统计

方法一:利用Roslyn脚本直接解析字符串字面量

这种方法直接借助C#编译器处理转义逻辑,无需手动实现规则,省心高效。

步骤:

  1. 安装NuGet包 Microsoft.CodeAnalysis.CSharp.Scripting
  2. 使用以下代码:
using System;
using System.IO;
using Microsoft.CodeAnalysis.CSharp.Scripting;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        var lines = File.ReadAllLines("text.txt");
        int totalDifference = 0;

        foreach (var line in lines)
        {
            int originalLength = line.Length;
            // 将原字符串作为C#字符串字面量直接求值,得到解析后的实际字符串
            string parsedString = await CSharpScript.EvaluateAsync<string>(line);
            int parsedLength = parsedString.Length;
            totalDifference += parsedLength - originalLength;
        }

        Console.WriteLine($"总差值:{totalDifference}");
    }
}

方法二:手动模拟C#转义规则(无额外依赖)

如果不想引入外部包,可以针对题目涉及的转义场景(\\、\"、\xXX)实现轻量解析逻辑:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        var lines = File.ReadAllLines("text.txt");
        int totalDifference = 0;

        foreach (var line in lines)
        {
            int originalLength = line.Length;
            int parsedLength = CalculateParsedLength(line);
            totalDifference += parsedLength - originalLength;
        }

        Console.WriteLine(totalDifference);
    }

    private static int CalculateParsedLength(string input)
    {
        int length = 0;
        int index = 1; // 跳过开头的双引号
        int endIndex = input.Length - 1; // 跳过结尾的双引号

        while (index < endIndex)
        {
            if (input[index] == '\\')
            {
                index++;
                switch (input[index])
                {
                    case '\\':
                    case '"':
                        // 这类转义最终对应一个字符
                        length++;
                        index++;
                        break;
                    case 'x':
                        // \xXX 转义为单个字符,跳过x和两位十六进制数
                        length++;
                        index += 3;
                        break;
                    default:
                        // 题目未涉及其他转义,按需扩展即可
                        length++;
                        index++;
                        break;
                }
            }
            else
            {
                length++;
                index++;
            }
        }

        return length;
    }
}

核心逻辑说明:

  • 原字符串长度:直接取每行字符串的Length属性
  • 解析后长度:方法一通过编译器求值得到实际字符串后统计长度;方法二手动遍历处理转义规则,统计解析后的有效字符数
  • 最终结果:累加每行的「解析后长度 - 原长度」得到总差值

内容的提问来源于stack exchange,提问作者LuiGG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:55:36