C# NET中最简单的键/值对文件解析

C# NET中最简单的键/值对文件解析,c#,.net,key-value,C#,.net,Key Value,我的项目需要一个文件,我将在其中存储用户应该能够读取和修改的密钥/值对数据。我希望程序只希望密钥在那里,我希望尽快从文件中解析它们 我可以将它们存储在XML中,但XML非常复杂,需要遍历节点和子节点等等,我只需要一些类来获取文件并生成键值对。我希望尽可能少的错误处理,我希望用尽可能少的代码来完成 我自己也可以编写这样的类,但我更愿意学习它在框架中的作用,而不是两次发明轮子。在.NET(3.5)中是否有一些内置的魔法类能够做到这一点 MagicClass kv = new MagicClass("

我的项目需要一个文件,我将在其中存储用户应该能够读取和修改的密钥/值对数据。我希望程序只希望密钥在那里,我希望尽快从文件中解析它们

我可以将它们存储在XML中,但XML非常复杂,需要遍历节点和子节点等等,我只需要一些类来获取文件并生成键值对。我希望尽可能少的错误处理,我希望用尽可能少的代码来完成

我自己也可以编写这样的类,但我更愿意学习它在框架中的作用,而不是两次发明轮子。在.NET(3.5)中是否有一些内置的魔法类能够做到这一点

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format.
string Value1 = kv.get("Key1");
...

我不知道有什么内置类可以解析ini文件。我在需要的时候用过。它是根据MIT/X11许可证授权的,因此在封闭源代码程序中不存在任何问题

使用起来很方便。因此,如果您的Settings.ini文件的格式如下:

[Configuration]
Name = Jb Evain
Phone = +330101010101
key1=value1
key2=value2
使用它将非常简单:

var source = new IniConfigSource ("Settings.ini");
var config = source.Configs ["Configuration"];

string name = config.Get ("Name");
string phone = config.Get ("Phone");

按以下方式格式化文件:

[Configuration]
Name = Jb Evain
Phone = +330101010101
key1=value1
key2=value2
将整个文件读入一个字符串(可能在file或string类中有一个简单的便利函数),然后调用string.Split('=')。确保在遍历列表时对每个键和值调用string.Trim(),并将每对键和值弹出到哈希表或字典中。

为键和值使用该类,然后只需将一个带


这是我觉得最简单的方法。您不必担心遍历节点。调用反序列化函数将为您做到这一点。如果用户愿意,也可以编辑文件中的值。

如果您希望用户能够读取和修改文件,我建议使用逗号分隔的对,每行一个

key1,value1
key2,value2
...

解析很简单:读取文件,在换行符或逗号处拆分,然后成对地获取元素

如果您正在寻找一个快速简单的函数,并且不想使用.Net app\user config设置文件或担心有时会出现的序列化问题

以下静态函数可以加载格式为
KEY=VALUE
的文件

public static Dictionary<string, string> LoadConfig(string settingfile)
{
    var dic = new Dictionary<string, string>();

    if (File.Exists(settingfile))
    {
        var settingdata = File.ReadAllLines(settingfile);
        for (var i = 0; i < settingdata.Length; i++)
        {
            var setting = settingdata[i];
            var sidx = setting.IndexOf("=");
            if (sidx >= 0)
            {
                var skey = setting.Substring(0, sidx);
                var svalue = setting.Substring(sidx+1);
                if (!dic.ContainsKey(skey))
                {
                    dic.Add(skey, svalue);
                }
            }
        }
    }

    return dic;
}

还不如将其格式等效于Java属性文件,并使用equals而不是逗号。@JeeBee:但这将假定用户熟悉Java属性文件格式;Nicholas Mancuso指出,csv格式可以用Excel或notepadAs进行编辑,XML序列化不需要遍历节点等。必须考虑到
KeyValuePair
是不可序列化的。在接下来的问题中讨论了解决方案的更详细描述:您能提供一个实际的例子吗?