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