我很好奇,我正在编写一个实用程序,用于我玩的旧游戏,这允许自定义NPC。简而言之,我正在为这些自定义NPC文件编写读卡器代码。我用line.contains()方法得到了大部分的读数(所有代码都将在后面显示),但是有一个问题。该文件可以包含" height"或" gfxheight"哪两个都做不同的事情。使用line.contains(" width")将使其输出width和gfxwidth两次。我真的不知道如何解释它,所以这里的文件是:
width=32
height=32
gfxwidth=64
gfxheight=32
nofireball=1
noiceball=1
noyoshi=1
grabside=0
当我读入控制台输出并执行分割线条所需的操作时输出:
这里是我用于身高和gfxheight的代码(当然还有其他但这些是我阅读时遇到的唯一问题):
if (line.Contains("height"))
{
var split = line.Split(new char[] { '=' }, 2);
decimal dc;
//var val = int.Parse(split.ToString());
Console.WriteLine(split[0].ToString() + " is equal to " + split[1].ToString());
npcHeight.Value = Decimal.Parse(split[1].ToString());
npcHeight.Enabled = true;
npcHCb.Checked = true;
}
if (line.Contains("gfxheight"))
{
var split = line.Split(new char[] { '=' }, 2);
//var val = int.Parse(split.ToString());
Console.WriteLine(split[0].ToString() + " is equal to " + split[1].ToString());
}
当然还有宽度和gfxwidth的代码以及其他各种代码,但我不打算发布这些代码,因为我可以将我得到的高度应用于那些。 那么我需要做些什么来区分它们呢?建议?
先谢谢了,
麦克
答案 0 :(得分:2)
将文件读入字符串数组,然后将其解析为字典。
var file = File.ReadAllLines(yourFile);
var config = (from line in file
let s = line.Split('=')
select new { Key = s[0], Value = s[1] })
.ToDictionary(x => x.Key, x => x.Value);
现在,您可以通过引用密钥来访问您想要的任何内容:
var gfxHeight = config["gfxheight"]; // gfxHeight is a string containing "32"
如果您知道=
总是之后的值,您可以解析它:
var config = (from line in file
let s = line.Split('=')
select new { Key = s[0], Value = int.Parse(s[1]) })
.ToDictionary(x => x.Key, x => x.Value);
var gfxHeight = config["gfxheight"]; // gfxHeight is an int containing 32
答案 1 :(得分:1)
不要试图在分割之前弄清楚每条线是什么,而是先尝试拆分它。此解析方法利用文件的格式,并且对数据的依赖性大大降低:
foreach (var line in lines) {
var data = line.Split('=', 2);
if (data.Length != 2) {
continue;
}
var attrib = data[0];
var value = data[1];
Console.WriteLine(attrib + " is equal to " + value);
switch (attrib) {
case "height":
// ...
break;
case "gfxheight":
// ...
break;
}
}
答案 2 :(得分:0)
我实际上找到了解决方案!请注意:我还没有刷新页面,还没有看到任何建议的答案。
if (line.Contains("width"))
{
if (line.Contains("gfx"))
{
var split = line.Split(new char[] { '=' }, 2);
//var val = int.Parse(split.ToString());
Console.WriteLine(split[0].ToString() + " is equal to " + split[1].ToString());
npcWidth.Value = Decimal.Parse(split[1].ToString());
npcWidth.Enabled = true;
npcWCb.Checked = true;
}
else
{
var split = line.Split(new char[] { '=' }, 2);
Console.WriteLine(split[0].ToString() + " is equal to " + split[1].ToString());
pNpcWidth.Value = Decimal.Parse(split[1].ToString());
pNpcWidth.Enabled = true;
pNpcWidthCb.Checked = true;
}
}
基本上就是^
它做的是检查该行是否是该行的宽度。包含方法。如果确实如此,那么它会检查它是否包含gfx(如gfxheight,gfxwidth等),如果确实如此,则表示gfxheight或gfxwidth值。如果没有,它是常规的高度/宽度。