C# 在C语言中使用Dictionary方法#

C# 在C语言中使用Dictionary方法#,c#,.net,dictionary,C#,.net,Dictionary,我目前正在使用C#中的Dictionary方法成功地为文本文件编制索引,不过在本例中,我希望为多个关键字(#HostName)编制索引。我已经尝试在方法中添加一个额外的IF语句,尽管它似乎不起作用——我的意思是它似乎破坏了整个方法 var dictionary = new Dictionary<string, string>(); var lines = File.ReadLines("probe_settings.ini"); var ee = lines.GetEnumer

我目前正在使用C#中的Dictionary方法成功地为文本文件编制索引,不过在本例中,我希望为多个关键字(#HostName)编制索引。我已经尝试在方法中添加一个额外的IF语句,尽管它似乎不起作用——我的意思是它似乎破坏了整个方法

 var dictionary = new Dictionary<string, string>();
 var lines = File.ReadLines("probe_settings.ini");
 var ee = lines.GetEnumerator();
 while (ee.MoveNext())
 {
     if (ee.Current.StartsWith("#PortNo"))
     {
         string test = ee.Current;
         if (ee.MoveNext())
         {
             dictionary.Add(test, ee.Current);
         }
         else
         {
             throw new Exception("File not in expected format.");
         }
     }
 }

你是说除了使用
if(ee.Current.StartsWith(“#PortNo”)
之外,还使用
else if
进行另一项测试吗?我不明白为什么不。发布(更多)代码

或用于循环

for( int i =0 ; i < lines.length -1 ;i++)
{
         if (!string.IsNullOrEmpty(lines[i]) && lines[i].StartsWith("#MatchOne") || lines[i].StartsWith("#MatchTwo"))
         {
             string test = lines[i];
             if ( !dictionary.ContainsKey(test))
             {
                 dictionary.Add(test, lines[i+1]);
             }
             else
             {
                 throw new Exception("File not in expected format.");
             }
         }
}
for(int i=0;i
您可以使用Linq及其
ToDictionary()
方法-这将创建一个字典,使用以
#
开头的任何一行作为键,下一行作为值:

var lines = File.ReadAllLines("probe_settings.ini");
var dictionary = lines.Zip(lines.Skip(1), (a, b) => new { Key = a, Value = b })
                      .Where(l => l.Key.StartsWith("#"))
                      .ToDictionary(l => l.Key, l => l.Value);
这会带来一些开销,因为这将在文件上迭代两次(因为使用的是
Zip()
),但对于一个非常小的配置文件来说,这并不重要

你可以这样使用字典:

string someValue = dictionary["#CheckName2"]; //returns "HTTPS Check"

文件格式是这样的:关键字在一行,关键字的值在下一行?当你说“它似乎破坏了整个方法”时,你的确切意思是什么?作为旁注,你应该处理你的枚举器,最好的方法是使用块将其放入
中。你必须发布数据文件的样本。-1:没有足够的信息来回答这个问题。“破坏整个方法”不足以传达您试图解决的问题,您对
BrokenGlass
答案的评论表明您可能希望每个键有多个值。由于您没有详细说明您对成功答案的期望,我们无法合理地提供答案。出于某种原因,这样做会导致相同的问题,几乎就像方法停止一样,即使我要求出现的消息框没有出现,也没有引发异常。@BenThorsby您尝试过我的第二种方法吗?嗨,是的,但我得到:“错误2无法将带[]的索引应用于'System.Collections.Generic.IEnumerable'类型的表达式”使用
File.ReadAllLines
而不是
File.ReadLines
,您将如何准确地从字典中调用某个内容?@BenThorsby:正如您通常所做的那样-更新答案嗯,多么奇怪,它返回:”已添加具有相同密钥的项。“@BenThorsby:您是否尝试为同一密钥添加多个值?如果是,则需要进行查找。我在您的文件上进行了测试,结果对我很好。嗨,不,我没有,我很困惑:(
var lines = File.ReadAllLines("probe_settings.ini");
var dictionary = lines.Zip(lines.Skip(1), (a, b) => new { Key = a, Value = b })
                      .Where(l => l.Key.StartsWith("#"))
                      .ToDictionary(l => l.Key, l => l.Value);
string someValue = dictionary["#CheckName2"]; //returns "HTTPS Check"