如何在C#中将字符串作为代码初始化另一个字符串?
Advent of Code 2015 第8题:字符串转义长度差值统计
方法一:利用Roslyn脚本直接解析字符串字面量
这种方法直接借助C#编译器处理转义逻辑,无需手动实现规则,省心高效。
步骤:
- 安装NuGet包
Microsoft.CodeAnalysis.CSharp.Scripting - 使用以下代码:
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
相关产品推荐
相关产品推荐

