2014-11-18 2 views
0

, поэтому я создаю древовидную структуру с моими данными, и я хочу избежать вложенных вложенных вложенных повторений. В детях у детей могут быть дети, и мне нужно знать, какие данные сделать сбрасываемыми и дать значок папки. Есть ли способ упростить это? Заранее спасибо.Упростить вложенные циклы?

foreach (var i in mlist) 
{ 
    // if this is a matching child 
    if (i.key == dto.under.ToString()) 
    { 
     // add this as a child 
     i.children.Add(m1); 
    } 

    //check children also 
    foreach (var i2 in i.children) 
    { 
     if (i2.key == dto.under.ToString()) 
     { 
      // add this as a child 
      i2.children.Add(m1); 
     } 

     if (i2.children.Count != 0) 
     { 
      i2.folder = true; 
     } 
     else 
     { 
      i2.folder = false; 
     } 


     foreach (var i3 in i2.children) 
     { 
      if (i3.key == dto.under.ToString()) 
      { 
       // add this as a child 
       i3.children.Add(m1); 
      } 

      if (i3.children.Count != 0) 
      { 
       i3.folder = true; 
      } 
      else 
      { 
       i3.folder = false; 
      } 

     } 

    } 


    if (i.children.Count != 0) 
    { 
     i.folder = true; 
    } 
    else 
    { 
     i.folder = false; 
    } 
} 
+5

Сделать петлю [рекурсивная] (HTTP : //stackoverflow.com/questions/26998209/simplify-nes Ted-петля). – James

+1

Оператор if может быть просто написан как 'i.folder = i.children.Count! = 0' –

+1

Что это связано с Javascript? –

ответ

1

Вот рекурсивный пример текущего цикла

public void Traverse(List<Item> items, Item dto, Item m1) 
{ 
    foreach (var i in items) 
    { 
     // if this is a matching child 
     if (i.key == dto.under.ToString()) 
     { 
      // add this as a child 
      i.children.Add(m1); 
     } 
     i.folder = i.children.Count != 0; 
     Traverse(i.children, dto, m1); 
    }  
} 
... 
Traverse(mlist, dto, m1); 
0

Вы должны рекурсивную функцию

foreach (var i in mlist) 
{ 
    checkChildren(i); 
} 

, а затем

void checkChildren(List i) // i is of type List? 
{ 
    if (i.key == dto.under.ToString()) 
    { 
     // add this as a child 
     i.children.Add(m1); 

     // what is m1? you may have to pass 
     // this in as a parameter. I am not 
     // really sure what it is 
    } 

    if (i.children.Count != 0) 
    { 
     i.folder = true; 
    } 
    else 
    { 
     i.folder = false; 
    } 

    foreach (var i2 in i.children) 
    { 
     checkChildren(i2); 
     // this will call the same function again, 
     // but this time on the next level of your hierarchy 
    } 

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