使用Line.Contains()区分不同的值

时间:2014-03-29 19:47:09

标签: c# string split streamreader

我很好奇,我正在编写一个实用程序,用于我玩的旧游戏,这允许自定义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

当我读入控制台输出并执行分割线条所需的操作时输出:

enter image description here

这里是我用于身高和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的代码以及其他各种代码,但我不打算发布这些代码,因为我可以将我得到的高度应用于那些。 那么我需要做些什么来区分它们呢?建议?

先谢谢了,

麦克

3 个答案:

答案 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值。如果没有,它是常规的高度/宽度。