2012-03-21 73 views
0

我已經寫了代碼,添加多個鍵的字典,我定義我的字典如下,並添加鍵和值遍歷的

Dictionary<int, Dictionary<int, List<int>>> outerDictionary = new Dictionary<int, Dictionary<int, List<int>>>();

現在我會多鍵字典中的每個關鍵喜歡通過,以獲得所需的項目每個鍵循環任何一個可以告訴我怎麼才能通過爲每個鍵值按我dictionary

我的代碼迴路

Dictionary<int, Dictionary<int, List<int>>> outerDictionary = new Dictionary<int, Dictionary<int, List<int>>>(); 
Dictionary<int, List<int>> innerDictionary; 

    ArrayList arrPayPeriodID = new ArrayList(); 
    ArrayList arrPayYear = new ArrayList(); 
    ArrayList arrEmpID = new ArrayList(); 

    int[] ipayYear = new int[] { }; 
    int[] iPayPeriodID = new int[] { }; 
    int[] iEmpID = new int[] { }; 

    int ipayYr = 2011; 
    int ipayYr1 = 2011; 
    int ipayYr2 = 2012; 
    int ipayYr3 = 2012; 

    int PayPeriodID = 1; 
    int payperiodid1 = 2; 
    int payperiodid2 = 2; 
    int payperiodid3 = 2; 

    int EmpID = 1; 
    int EmpID1 = 1; 
    int EmpID2 = 1; 
    int EmpID3 = 1; 

    arrEmpID.Add(EmpID); 
    arrEmpID.Add(EmpID1); 
    arrEmpID.Add(EmpID2); 
    arrEmpID.Add(EmpID3); 

    arrPayPeriodID.Add(PayPeriodID); 
    arrPayPeriodID.Add(payperiodid2); 
    arrPayPeriodID.Add(payperiodid3); 
    arrPayPeriodID.Add(payperiodid1); 

    arrPayYear.Add(ipayYr); 
    arrPayYear.Add(ipayYr1); 
    arrPayYear.Add(ipayYr2); 
    arrPayYear.Add(ipayYr3); 

    iEmpID = (int[])arrEmpID.ToArray(typeof(int)); 

    iPayPeriodID = (int[])arrPayPeriodID.ToArray(typeof(int)); 

    ipayYear = (int[])arrPayYear.ToArray(typeof(int)); 


    DataTable table = GetTable(iEmpID, ipayYear, iPayPeriodID); 
    DataRow row = table.Rows[0]; 

    for (int i = 0; i < table.Rows.Count; i++) 
    { 
     DataRow row1 = table.Rows[i]; 
     var employeeId = (int)row1["EmpID"]; 
     var payYear = (int)row1["Year"]; 
     var payId = (int)row1["PayID"]; 



     if (!outerDictionary.TryGetValue(employeeId, out innerDictionary)) 
     { 
      innerDictionary = new Dictionary<int, List<int>>(); 
      outerDictionary.Add(employeeId, innerDictionary); 
     } 
     List<int> list; 
     if (!innerDictionary.TryGetValue(payYear, out list)) 
     { 
      list = new List<int>(); 
      innerDictionary.Add(payYear, list); 
     } 

     list.Add(payId); 
    } 

static DataTable GetTable(int[] empID, int[] payYr, int[] payID) 
{ 

    // Here we create a DataTable with four columns. 
    DataTable table = new DataTable(); 
    table.Columns.Add("EmpID", typeof(int)); 
    table.Columns.Add("Year", typeof(int)); 
    table.Columns.Add("PayID", typeof(int)); 

    // Here we add five DataRows. 
    for (int i = 0; i < empID.Length; i++) 
    { 
     table.Rows.Add(empID[i], payYr[i], payID[i]); 
    } 
    return table; 
} 
+4

你是什麼意思 「以」 是什麼意思?按什麼順序? '字典<,>'不保存任何種類的訂單。由於您擁有嵌套字典,因此也不清楚您的意思是什麼樣的關鍵。就我個人而言,我發現這種嵌套通常是一種設計氣味,表明這些值應該是其他類型的封裝*其他集合。 – 2012-03-21 15:08:36

+2

詞典中沒有順序。他們不能保證按照他們的順序返回。 – 2012-03-21 15:09:14

回答

2
Dictionary<int, Dictionary<int, List<int>>> outer = new Dictionary<int, Dictionary<int, List<int>>>(); 
foreach(var outerKey in outer.Keys.OrderBy(x => x)) 
{ 
    foreach(var innerKey in outer[outerKey].Keys.OrderBy(x => x)) 
     Console.WriteLine(outer[outerKey][innerKey]); 
} 
3

要通過外和內環路,以便:

foreach (int key in outerDictionary.Keys.OrderBy(i=>i)) 
{ 
    // loop through the inner items by key 
    var item = outerDictionary[key]; 
    foreach(int innerKey in item.Keys.OrderBy(i=>i)) 
    { 
     .... 
    } 
} 
+0

那麼主要字典那麼 – Dotnet 2012-03-21 15:08:33

+0

+1在另一個裏面做另一個foreach;) – gbianchi 2012-03-21 15:09:44

0

嘗試此;

Dictionary<int, Dictionary<int, List<int>>> outerDictionary = new Dictionary<int, Dictionary<int, List<int>>>(); 

     foreach (var pair in outerDictionary) 
     { 
      foreach (var temp in pair.Value) 
      { 
       // do something 
      } 
     } 
0

這給了我更好的解決方案

foreach(int outerKey in outerDictionary.Keys) 
    { 
     Dictionary<int, List<int>> outerValue = outerDictionary[outerKey]; 

     foreach(int innerKey in outerValue.Keys) 
     { 
      List<int> innerValue = outerValue[innerKey]; 
      foreach(int item in innerValue) 
      { 
      // do something with item 
      } 
     } 
    } 
+0

它和我在下面提供的任何東西一樣。只有更詳細。 – gprasant 2012-03-22 01:46:56