2014-02-07 178 views
0

目前,我正在做一些解析我为小游戏制作的模板的工作。通过词典词典进行迭代

它看起来像这样:

HEADER:NPC 
NAME:Goblin 
NAMEPLURAL:Goblins 
NAMECHILD:Gob'in 
NAMECHILDPLURAL:Gob'ins 
MOVEMENT0:WALK 
MOVEMENT1:RUN 
MOVEMENT2:SWIM 
BASEHP:30 
BASEMANA:0 
BASELEVEL:1?9 

在我的解析器我执行以下操作:

class TemplateParser 
{ 
    public String folder { get; set; } 

    public TemplateParser(String folder) 
    { 
     this.folder = folder; 
    } 

    public Dictionary<String, Dictionary<String, String>> Parse() 
    { 
     Dictionary<String, Dictionary<String, String>> parsedTemplates = 
      new Dictionary<String, Dictionary<String, String>>(); 

     String[] files = Directory.GetFiles(folder); 
     StreamReader reader; 

     foreach (String s in files) 
     { 
      try 
      { 
       String line = ""; 
       reader = new StreamReader(s); 
       Dictionary<String, String> attributes = new Dictionary<String, String>(); 
       while((line = reader.ReadLine()) != null) 
       { 
        string[] split = line.Split(':'); 
        attributes.Add(split[0], split[1]); 
       } 
       parsedTemplates.Add(Path.GetFileNameWithoutExtension(s), attributes); 
       reader.Close(); 
      } 
      catch (IOException ioe) 
      { 
       Log.LogMessage(ioe.Message, ELogFlag.CRITICAL); 
      } 
     } 

     return parsedTemplates; 
    } 
} 

现在这里是问题:

当我试图通过这个集合来看看(运行后Parse())我想做一个小测试,并写出包含“哥布林”字典中的所有信息的字典。

到目前为止,我所有的尝试都是徒劳的,因为当我做templates["Goblin"]我希望我能得到一本字典,我可以迭代foreach()但它不会让我这样做。它说了一些关于转换不可能的事情。然后我寻找一个枚举器,但我无法让枚举器迭代。

我错过了什么?

+0

你有什么确切的错误? –

+0

@SergeyBerezovskiy它不是一个错误,因为它忽略了在字典中迭代字典的逻辑。 – OmniOwl

+0

@Vipar你得到的错误*特别提到了对象的实际类型。如果你看过它,它会解释你需要改变类型。 – Servy

回答

2

没有看到你的代码印刷字典,因为编译“说了一些不被可能的转换,”看来你的代码没有使用正确的元素键入你的循环。

这里是你如何可以遍历字典的字典,不管他们的主要类型:

var dictOfDictionaries = Parse(); 
foreach (var dictPair in dictOfDictionaries) { 
    Console.WriteLine("Key: {0}", dictPair.Key); 
    foreach (var innerPair in dictPair.Value) { 
     Console.WriteLine("\t{0}:{1}", innerPair.Key, innerPair.Value); 
    } 
} 
+0

谢谢你做到了!我完全忘了'var'关键字。 – OmniOwl

+1

@Vipar你不需要*'var'。它只是防止你需要输入实际类型。在这种情况下,这当然是值得的,因为类型名称非常漫长,但由于没有匿名类型,所以不需要*。另一个答案表明。 – Servy

1

下面是一个例子:

Dictionary<int,Dicationary<string,char>> lol = new Dictionary<int,Dicationary<string,char>>(); 
foreach(KeyValuePair<int, Dictionary<string,char>> kvp in lol) 
{ 
    int test = kvp.Key; 
    foreach(KeyValuePair<string,char> kvp2 in kvp.Value) 
    { 
     string s = kvp.Key; 
     char c = kvp.Value; 
    } 
}