2009-12-01 5 views
0

У меня есть ArrayList, содержащий строки, а также другие ArrayLists, которые могут содержать строки или даже больше ArrayLists.Извлечение нескольких уровней ArrayList

Есть ли простой способ извлечь все строки из этого многоуровневого массива ArrayList?

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

ответ

5
public static ArrayList FlattenList(ArrayList list) { 
    ArrayList l = new ArrayList(); 
    FillList(list, l); 
    return l; 
} 
private static void FillList(ArrayList source, ArrayList listToFill) { 
    foreach (object o in source) { 
     ArrayList l = o as ArrayList; 
     if (l != null) 
      FillList(l, listToFill); 
     else 
      listToFill.Add(o); 
    } 
} 
+1

Вы можете использовать «как» вместо «есть» + литая , –

+0

@Romain: Хорошая точка. Я уже редактировал ответ. Собственно, для этого кода это не просто оптимизация производительности. Старая версия будет вызывать «NullReferenceException», если значение «null» существует в любом месте иерархии. –

+0

Спасибо ... отлично работает :) – Greycrow

0

В качестве альтернативы, если вы можете использовать дженерики и итераторов блоков, то становится возможным иметь один метод:

public static IEnumerable<string> GetStrings(ArrayList list) 
    { 
     foreach(var item in list) 
     { 
      var @string = item as string; 
      if (@string != null) 
       yield return @string; 

      var nestedList = item as ArrayList; 
      if(nestedList == null) 
       continue; 

      foreach (var childString in GetStrings(nestedList)) 
       yield return childString; 
     } 
    } 
Смежные вопросы