2015-06-19 6 views
-1

У меня есть словарь с краткими значениями. Мой словарь:Рекурсия для вложенного словаря

public class checkitems: Dictionary<int, checkitems>{ 
    // .... 
} 

Я перехожу на каждый уровень, как этот.

foreach(KeyValuePair<int, checkitems> first in items){ 
    foreach(KeyValuePair<int, checkitems> second in first.values){ 
     foreach(KeyValuePair<int, checkitems> third in second.values){ 
      List<int> list1 = new List<int>(); 
      if(third.Value.Age > 20){ 
       list.Add(x.key) 
      } 
     } 
     foreach(var deleteKeys in list1){ 
     second.Value.Remove(deleteKeys) 
     } 
    } 
} 

В настоящее время я пишу Еогеасп для каждого уровня и проверки, чтобы увидеть, если она удовлетворяет условию, а затем добавить его в список, чтобы удалить. Я хотел бы знать, как бы я написал его рекурсивно, чтобы мне не пришлось беспокоиться о том, насколько глубоки уровни.

Example data format: 
    Companies 
     i. Apple 
      a. key: Macbookpro Value: 200 
      b (key): IMAC  Value: 334 
      c (key): Iphone  Value : 12 
       1. (key) IOS8 Value : 13 
       2. (key) IOS7 Value : 15 
      d (key): Beats  Value: 20 
+0

Я не могу расшифровать код. Можете ли вы объяснить, что вы пытаетесь выполнить? И не только вы хотите использовать рекурсию. Использование рекурсии (надеюсь) означает конец. Каков ваш «конец», чего вы хотите добиться от своего кода? – sstan

+0

Код, который вы предоставили, не имеет возможности компилировать - поэтому любой недействительный код, который короче вашего, будет делать ... Если вам нужны реальные рекомендации - обязательно укажите действительный код и почему он не удовлетворяет вашим потребностям. –

+0

Не могли бы вы предоставить полное определение для 'checkitems' и сообщить нам, как ваш формат данных примера применяется к' checkitems'? – Enigmativity

ответ

1

Я старался понять, что ваш код пытается достичь. Надеюсь, что это помогает

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication2 
{ 
    public static class Program 
    { 
     public static void RecurseCheckitems(CheckItems items) 
     { 
      List<Int32> l_deleteKeys = new List<Int32>(); 

      // Step 1: DFS - Down down down to the deepest level 
      foreach (Int32 key in items.Keys) 
      { 
       RecurseCheckitems(items[key]); 
      } 

      // Step 2: Extract all KEYS of Childelements having an AGE of at least 20 
      foreach (Int32 key in items.Keys) 
      { 
       l_deleteKeys.AddRange(DoCheckItems(items[key])); 
      } 

      // Step 3: Remove all extracted keys from the current Objecct 
      foreach (Int32 deleteKey in l_deleteKeys) 
      { 
       items.Remove(deleteKey); 
      } 
     } 

     /// <summary> 
     /// Helper-Function to extract the keys of Child-Elements having an age of at least 20 
     /// </summary> 
     /// <param name="item">Parent-Item to check</param> 
     /// <returns>List of KEYS of Child-Elements having an Age of at least 20</returns> 
     private static List<Int32> DoCheckItems(CheckItems item) 
     { 
      List<Int32> l = new List<Int32>(); 

      foreach (Int32 key in item.Keys) 
      { 
       if (item[key].Age > 20) 
       { 
        l.Add(key); 
       } 
      } 

      return l; 
     } 
    } 

    public sealed class CheckItems : Dictionary<Int32, CheckItems> 
    { 
     public Int32 Age { get; set; } 
    } 
} 
0

дан root экземпляр checkitems, попробуйте следующее:

Func<checkitems, IEnumerable<Tuple<checkitems, checkitems>>> flatten = null; 
flatten = cis => 
    cis 
     .Select(x => Tuple.Create(cis, x.Value)) 
     .Concat(cis.SelectMany(c => flatten(c.Value))); 

foreach (var tuple in flatten(root) 
    .Where(x => x.Item2.Age > 20) 
    .ToArray()) 
{ 
    tuple.Item1.Remove(tuple.Item2); 
} 
Смежные вопросы