C# 用C语言读取ini文件

C# 用C语言读取ini文件,c#,arrays,string,C#,Arrays,String,我正在尝试读取具有以下格式的ini文件: SETTING=VALUE SETTING2=VALUE2 我目前拥有以下代码: string cache = sr.ReadToEnd(); string[] splitCache = cache.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries); 这给了我一个设置列表,但是,我想做的是把它读入字典。我的问题是

我正在尝试读取具有以下格式的ini文件:

SETTING=VALUE 
SETTING2=VALUE2
我目前拥有以下代码:

string cache = sr.ReadToEnd();                    
string[] splitCache = cache.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

这给了我一个设置列表,但是,我想做的是把它读入字典。我的问题是,有没有一种方法可以在不遍历整个数组并手动填充字典的情况下执行此操作?

好的,您可以使用LINQ和do

Dictionary<string, string> ini = (from entry in splitCache
                                  let key = entry.Substring(0, entry.FirstIndexOf("="))
                                  let value = entry.Substring(entry.FirstIndexOf("="))
                                  select new { key, value }).ToDictionary(e => e.key, e => e.value);
正如Binary Worrier在评论中指出的那样,这种方法与其他答案所建议的简单循环相比没有优势

编辑:上面块的较短版本将是

Dictionary<string, string> ini = splitCache.ToDictionary(
                                   entry => entry.Substring(0, entry.FirstIndexOf("="),
                                   entry => entry.Substring(entry.FirstIndexOf("="));

为什么不将文件作为单独的行读取,然后在第一行上循环拆分


在.NET 4中,将ReadAllLines替换为ReadLines,为了避免创建数组,ReadLines返回IEnumerable并延迟读取文件。

迭代有什么问题

var lines = File.ReadAllLines("pathtoyourfile.ini");
var dict = new Dictionary<string, string>();

foreach(var s in lines)
{
     var split = s.Split("=");
     dict.Add(split[0], split[1]);
}

实际上,在kernel32.dll中有一个用于读取/写入INI文件的Windows API;请参阅以获取示例。

尝试这样做

[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]

public static extern int GetPrivateProfileString(string SectionName, string KeyName, string Default, StringBuilder Return_StringBuilder_Name, int Size, string FileName);
GetPrivateProfileString(Section_Name, "SETTING", "0", StringBuilder_Name, 10, "filename.ini");
然后像这样调用函数

[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]

public static extern int GetPrivateProfileString(string SectionName, string KeyName, string Default, StringBuilder Return_StringBuilder_Name, int Size, string FileName);
GetPrivateProfileString(Section_Name, "SETTING", "0", StringBuilder_Name, 10, "filename.ini");

值可以从StringBuilder\u Name访问。

INI文件有点棘手,所以我不建议您自己滚动。我写了一个配置库,它是一个非常快速的解析器

示例INI文件:

; This is a comment
[My Section]
key 1 = value 1
key 2 = value 2

[Pets]
dog = rover
cat = muffy
相同的C代码:

// Load the file
IniDocument doc = new IniDocument ("test.ini");

// Print the data from the keys
Console.WriteLine ("Key 1: " + doc.Get ("My Section", "key 1"));
Console.WriteLine ("Key 2: " + doc.Get ("Pets", "dog"));

// Create a new section
doc.SetSection ("Movies");

// Set new values in the section
doc.SetKey ("Movies", "horror", "Scream");
doc.SetKey ("Movies", "comedy", "Dumb and Dumber");

// Remove a section or values from a section
doc.RemoveSection ("My Section");
doc.RemoveKey ("Pets", "dog");

// Save the changes
doc.Save("test.ini");

为什么不直接使用foreach循环呢?我可以,但问题是我可以不通过数组执行它吗。是一个很好的INI读取器,如果您想跳过这个工作,应该是dict.Addparts[0],parts[1];,是吗?@pm_2。请注意,这只是在一些相当丑陋的linq下隐藏了一个非常简单的循环+1用于回答所问的问题,但是我宁愿使用循环。除了明显的可读性问题之外,使用此方法还有其他缺点吗?@pm_2:您不能使用调试器单步执行LINQ表达式。除此之外,我什么都不知道。这是有好处的。编译器/运行时更有可能自动对LINQ编写的代码进行parellize,这样它就可以在多个CPU上运行,而不是在一个循环中运行。这很好,对于ini文件的所有非平凡用途来说肯定很有用。