2012-06-25 69 views
0

我有下面的類:創建字典(哈希表)維持秩序

private class NodeTemp 
    {    
     public string Content; 
     public NodeTemp Next; 
     public NodeTemp Prev; 
    } 

,你可以看到我有NodeTemp Next爲了能夠對哈希表就像一個參考下一個元素NodeTemp Prev將引用散列表上的previos元素。

所以我有一個非常大的「xml」文本文件,我必須解析。我看起來像這樣:

<1><a5>: Abbrev Number: 2 (DW_TAG_base_type) 
    <a6> DW_AT_name  : unsigned short 
    <b5> DW_AT_byte_size : 2  
    <b6> DW_AT_encoding : 7 (unsigned) 
<1><b7>: Abbrev Number: 2 (DW_TAG_base_type) 
    <b8> DW_AT_name  : unsigned int 
    <c5> DW_AT_byte_size : 4  
    <c6> DW_AT_encoding : 7 (unsigned) 
<1><c7>: Abbrev Number: 2 (DW_TAG_base_type) 
    <c8> DW_AT_name  : unsigned char  
    <d6> DW_AT_byte_size : 1  
    <d7> DW_AT_encoding : 8 (unsigned char) 
<1><d8>: Abbrev Number: 4 (DW_TAG_pointer_type) 
    <d9> DW_AT_type  : DW_FORM_ref4 <0x552> 
<1><de>: Abbrev Number: 2 (DW_TAG_base_type) 
    <df> DW_AT_name  : void 
    <e4> DW_AT_byte_size : 0  
    <e5> DW_AT_encoding : 5 (signed) 
<1><e6>: Abbrev Number: 4 (DW_TAG_pointer_type) 
    <e7> DW_AT_type  : DW_FORM_ref_udata <0xde> 
<1><ea>: Abbrev Number: 4 (DW_TAG_pointer_type) 
    <eb> DW_AT_type  : DW_FORM_ref4 <0x180> 
<1><f0>: Abbrev Number: 4 (DW_TAG_pointer_type) 
    <f1> DW_AT_type  : DW_FORM_ref4 <0x4cb> 
<1><f6>: Abbrev Number: 4 (DW_TAG_pointer_type) 
    <f7> DW_AT_type  : DW_FORM_ref4 <0x4efb>  
<1><fc>: Abbrev Number: 2 (DW_TAG_base_type) 
    <fd> DW_AT_name  : char 
    <102> DW_AT_byte_size : 1 
    <103> DW_AT_encoding : 8 (unsigned char) 
..... 
.... 

我有一個方法,將通過它進行搜索,並一次返回一個塊。之所以我創建Dictionary<string, NodeTemp>而不是List<NodeTemp>是因爲性能原因,爲了查找我需要的節點,我必須進行多個查詢。

所以我現在所擁有的是:

var mtch = Regex.Match(GetUnparsedDebugInfo(), @"(?s)<\d+><\w+>.*?(?=\n <)"); 

int ctr = 0; // counter      
NodeTemp[] nodes = new NodeTemp[3]; // circular array 

while (mtch.Success) 
{ 

    /* mtch.value should = something like: 

       <1><a5>: Abbrev Number: 2 (DW_TAG_base_type) 
       <a6> DW_AT_name  : unsigned short 
       <b5> DW_AT_byte_size : 2  
       <b6> DW_AT_encoding : 7 (unsigned) 

    */ 

    var index = ctr % 3; // current possition in circular array 

    //get key 
    var k = Regex.Match(mtch.Value, @"><(\w+)>").Groups[1].Value; 

    var cNode = new NodeTemp() { Content = mtch.Value };       

    dictionary.Add(k, cNode); 

    nodes[index] = cNode; 

    if (ctr > 0) 
    { 
     var lastIndex = index - 1; 
     if (lastIndex < 0) 
     lastIndex = 2; 

     nodes[lastIndex].Next = cNode; 
     cNode.Prev = nodes[lastIndex]; 
    } 

    ctr++; 

    mtch = mtch.NextMatch(); 
} 

這不是工作,因爲nodes[index]包含一個對象,並在如果我改變它,它會改變一切結束的參考。我怎樣才能解決這個while循環?我不想創建一個List,然後將該大型列表轉換爲字典。我認爲這不會有效。

或者我可以創建一些其他類型的數據結構,使我能夠快速查詢我需要的節點,並且我也能夠維護順序。

回答