Console.WriteLine() 输出截断消息或错误 order/incomplete
Console.WriteLine() output truncated messages or in a wrong order/incomplete
嗯,我不知道为什么会这样,但这看起来很奇怪,因为我没有找到任何类似的东西:
如您所见,检查完整字符串我们可以看到整个输出,但在控制台中它看起来被截断了。等同于:
你注意到了吗?查看前 4 行。并查看检查员。缺少一些 tuple.Item1
和 yuple.Item2
.
您可以看到 LINQ select 上有问题。但我不明白为什么会这样。
在那里你可以看到完整的代码:
private const string ClassName = "ClassName",
InheritedClass = "InheritedClass";
private static void Main(string[] args)
{
var files = Directory.GetFiles(StaticPath, "*.cs", SearchOption.AllDirectories);
var classes = files.Select(file => GetClassesInFile(file)).SelectMany(c => c).ToList();
string fullMsg = string.Join(Environment.NewLine, classes.Select(tuple => $"{tuple.Item1}{(tuple.Item2.HasContent(string.Empty, " ") ? " : " + string.Join(", ", tuple.Item2) + " " : " ")}(on {Path.GetFileName(tuple.Item3)})"));
Console.WriteLine(fullMsg);
var unsealedClasses = classes.Where(c => !classes.Any(subClass => subClass.Item2.Contains(c.Item1))).ToList();
string msg = $"Unsealed classes count: {unsealedClasses.Count} ({string.Join(", ", unsealedClasses.Select(c => c.Item1))})";
Console.WriteLine(msg);
Console.Read();
}
private static IEnumerable<Tuple<string, string[], string>> GetClassesInFile(string file)
{
return Regex.Matches(File.ReadAllText(file), $"(public|internal|private) class (?<{ClassName}>(.+?))( : (?<{InheritedClass}>(.+?))|)\n")
.Cast<Match>()
.Select(m => new Tuple<string, string[], string>(GetGroupValue(m, ClassName), GetGroupValue(m, InheritedClass).CleanLineBreak().Split(','), file))
.Where(t => !string.IsNullOrEmpty(t.Item1));
}
private static string GetGroupValue(Match m, string groupName)
{
return m.Groups[groupName].Value.ToString();
}
GetGroupValue
从正则表达式组索引器输出一个字符串。
GetClassesInFile
输出一个IEnumerable of Tuple,其中Item1是class名称,Item2是它依赖的classes/interfaces,第三个Item是这个[的文件路径=60=].
注意: 如您所见,我还在 tuple.Item1
.
上过滤 null 或空字符串
我不知道这里发生了什么。但这太奇怪了,我第一次看到。
编辑:
我看了一下网友评论说的输出高度(参考:),我的输出超过9001:
Game
、MovieClip
和 SpriteTex
class 名称末尾有回车符 return 字符 \r
。尝试在 GetGroupValue
方法中调用 Trim()
。
private static string GetGroupValue(Match m, string groupName)
{
return m.Groups[groupName].Value.ToString().Trim();
}
嗯,我不知道为什么会这样,但这看起来很奇怪,因为我没有找到任何类似的东西:
如您所见,检查完整字符串我们可以看到整个输出,但在控制台中它看起来被截断了。等同于:
你注意到了吗?查看前 4 行。并查看检查员。缺少一些 tuple.Item1
和 yuple.Item2
.
您可以看到 LINQ select 上有问题。但我不明白为什么会这样。
在那里你可以看到完整的代码:
private const string ClassName = "ClassName",
InheritedClass = "InheritedClass";
private static void Main(string[] args)
{
var files = Directory.GetFiles(StaticPath, "*.cs", SearchOption.AllDirectories);
var classes = files.Select(file => GetClassesInFile(file)).SelectMany(c => c).ToList();
string fullMsg = string.Join(Environment.NewLine, classes.Select(tuple => $"{tuple.Item1}{(tuple.Item2.HasContent(string.Empty, " ") ? " : " + string.Join(", ", tuple.Item2) + " " : " ")}(on {Path.GetFileName(tuple.Item3)})"));
Console.WriteLine(fullMsg);
var unsealedClasses = classes.Where(c => !classes.Any(subClass => subClass.Item2.Contains(c.Item1))).ToList();
string msg = $"Unsealed classes count: {unsealedClasses.Count} ({string.Join(", ", unsealedClasses.Select(c => c.Item1))})";
Console.WriteLine(msg);
Console.Read();
}
private static IEnumerable<Tuple<string, string[], string>> GetClassesInFile(string file)
{
return Regex.Matches(File.ReadAllText(file), $"(public|internal|private) class (?<{ClassName}>(.+?))( : (?<{InheritedClass}>(.+?))|)\n")
.Cast<Match>()
.Select(m => new Tuple<string, string[], string>(GetGroupValue(m, ClassName), GetGroupValue(m, InheritedClass).CleanLineBreak().Split(','), file))
.Where(t => !string.IsNullOrEmpty(t.Item1));
}
private static string GetGroupValue(Match m, string groupName)
{
return m.Groups[groupName].Value.ToString();
}
GetGroupValue
从正则表达式组索引器输出一个字符串。GetClassesInFile
输出一个IEnumerable of Tuple,其中Item1是class名称,Item2是它依赖的classes/interfaces,第三个Item是这个[的文件路径=60=].
注意: 如您所见,我还在 tuple.Item1
.
我不知道这里发生了什么。但这太奇怪了,我第一次看到。
编辑:
我看了一下网友评论说的输出高度(参考:
Game
、MovieClip
和 SpriteTex
class 名称末尾有回车符 return 字符 \r
。尝试在 GetGroupValue
方法中调用 Trim()
。
private static string GetGroupValue(Match m, string groupName)
{
return m.Groups[groupName].Value.ToString().Trim();
}