Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多级阵列列表抽取_C#_Arraylist - Fatal编程技术网

C# 多级阵列列表抽取

C# 多级阵列列表抽取,c#,arraylist,C#,Arraylist,我有一个包含字符串的ArrayList,还包含其他可能包含字符串甚至更多ArrayList的ArrayList 有没有一种简单的方法可以从这个多级数组列表中提取所有字符串 我假设某个递归是不受欢迎的,但我还没能让它工作。作为替代方案,如果可以使用泛型和迭代器组,那么就有可能有一个方法: public static ArrayList FlattenList(ArrayList list) { ArrayList l = new ArrayList(); FillList(list,

我有一个包含字符串的ArrayList,还包含其他可能包含字符串甚至更多ArrayList的ArrayList

有没有一种简单的方法可以从这个多级数组列表中提取所有字符串


我假设某个递归是不受欢迎的,但我还没能让它工作。

作为替代方案,如果可以使用泛型和迭代器组,那么就有可能有一个方法:

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);
   }
}
    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;
        }
    }
公共静态IEnumerable GetString(ArrayList列表)
{
foreach(列表中的变量项)
{
var@string=项目作为字符串;
如果(@string!=null)
返回@字符串;
var nestedList=作为ArrayList的项;
if(nestedList==null)
继续;
foreach(GetStrings(nestedList)中的var childString)
产生返回子字符串;
}
}

作为替代方案,如果您可以使用泛型和迭代器组,则可以使用单一方法:

    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;
        }
    }
公共静态IEnumerable GetString(ArrayList列表)
{
foreach(列表中的变量项)
{
var@string=项目作为字符串;
如果(@string!=null)
返回@字符串;
var nestedList=作为ArrayList的项;
if(nestedList==null)
继续;
foreach(GetStrings(nestedList)中的var childString)
产生返回子字符串;
}
}

您可能希望使用“as”而不是“is”+cast。@罗曼:这一点很好。我已经在编辑答案了。实际上,对于这段代码,它不仅仅是性能优化。如果层次结构中的任何位置存在
null
值,则旧版本将抛出
null引用异常。您可能希望使用“as”而不是“is”+cast。@Romain:这一点很好。我已经在编辑答案了。实际上,对于这段代码,它不仅仅是性能优化。如果层次结构中的任何位置存在
null
值,则旧版本将抛出
NullReferenceException