2013-08-25 2 views
0
public class Group 
{ 
    public int ID; 
    public bool Earned; 
    public bool Available; 

    public List<Group> ChildGroups; 
    public List<Item> ChildItems; 
} 

public class Item 
{ 
    public int ID; 
    public bool Earned; 
    public bool Available; 
} 

public class Evaluator 
{ 
    public List<Group> FindEarned(Group source) 
    { 
     //Filter implementation 

     foreach (Group grp in source.Groups) 
     { 
      grp.Items = grp.Items.Where(
             x => x.Earned == true).ToList(); 

      if (grp.Groups != null && grp.Groups.Count > 0) 
      { 
       grp.Groups = FilterEarned(grp); 
      } 
      else 
      { 

      } 
     } 

     return source.Groups; 
    } 

} 

Метод поиска, который я нахожу, должен возвращать список групп, в которых любая дочерняя группа или элемент находятся в заработавшем состоянии. Пример:Анализ структуры вложенных объектов в восходящем приближении

Group1 - Pending 
    -Group11 -pending 
    -Group12 -pending 
    -Group13 -Pending 
    -Item11 -Pending 
    -Item12 -Pending 
Group2 
    -Group21 -pending 
    --Group211 -pending 
    ---Item2111 - earned 
    -Group22 -pending 
    -Group23 -Pending 
    -Item21 -Pending 
    -Item22 -Pending 

Метод должен возвращать

Group2 
    -Group21 -pending 
    --Group211 -pending 
    ---Item2111 - earned 
+0

@MarcinJuraszek добавлено – Mahesh

+1

И в чем вопрос? –

ответ

0

Я не уверен, что у меня есть ты прав, но если вам нужно отфильтровать все не Заработанные элементы и группы, вы можете использовать этот метод расширения , Это не очень удобно, потому что он должен подсчитывать детей, где Earned = true, а также создает новые группы, иначе исходные данные будут повреждены.

public static IEnumerable<Group> EarnedGroups(this IEnumerable<Group> data) 
    { 
     foreach (var group in data) 
     { 
      var items = group.ChildItems.Where(x => x.Earned).ToList(); 
      var groups = group.ChildGroups.EarnedGroups().ToList(); 
      if (items.Count > 0 || groups.Count > 0 || group.Earned) 
       yield return new 
         Group 
         { 
          ID = group.ID, 
          Available = group.Available, 
          Earned = group.Earned, 
          ChildItems = items, 
          ChildGroups = groups 
         }; 
     } 
    }