2012-03-21 2 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

Что вы имеете в виду "в порядке"? В каком порядке? 'Словарь <,>' не сохраняет никакого порядка. Также неясно, какой ключ вы имеете в виду, учитывая, что у вас есть вложенные словари. Лично я считаю, что такого рода вложенность обычно является запахом дизайна, предполагая, что значения должны быть каким-то другим типом, который * инкапсулировал * в другую коллекцию. –

+2

В словаре нет порядка. Они не гарантированно возвращаются в том порядке, в котором они были помещены. –

ответ

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

+0

+1 сделайте еще один foreach внутри этого;) – gbianchi

0

Try это;

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

Смежные вопросы