Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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:如何使用变量嵌套和变量类型遍历嵌套列表中的所有元素?_C#_Generics_Multidimensional Array_Nested - Fatal编程技术网

C# C:如何使用变量嵌套和变量类型遍历嵌套列表中的所有元素?

C# C:如何使用变量嵌套和变量类型遍历嵌套列表中的所有元素?,c#,generics,multidimensional-array,nested,C#,Generics,Multidimensional Array,Nested,我想创建一个函数 void StringFromNestedList<T>(T theList); 但我不知道需要多少for循环 它可行吗?我不确定尝试使它通用会给你带来什么好处 所以,首先假设它只接受一个对象 现在,假设我们不想处理列表,而是处理任何可枚举的内容。进一步假设我们已经让这个函数工作了——那么对于枚举中的每个项,我们可以递归地调用我们自己 { var enu = theList as IEnumerable; if(enu!=null) {

我想创建一个函数

void StringFromNestedList<T>(T theList);
但我不知道需要多少for循环


它可行吗?

我不确定尝试使它通用会给你带来什么好处

所以,首先假设它只接受一个对象

现在,假设我们不想处理列表,而是处理任何可枚举的内容。进一步假设我们已经让这个函数工作了——那么对于枚举中的每个项,我们可以递归地调用我们自己

{
    var enu = theList as IEnumerable;
    if(enu!=null)
    {
        foreach(var item in enu)
        {
            StringFromPossibleList(item);
        }
    }
    else
    {
        theList.ToString();
    }
}

通过使用递归,我们可以得到我们所需要的尽可能多的循环级别。

另一种迭代解决方案可以是这样的:

    public static IEnumerable<object> FlattenNestedLists(object obj)
    {
        var stack = new Stack();
        stack.Push(obj);
        while (stack.Count > 0)
        {
            var current = stack.Pop();
            if (current is IEnumerable list)
            {
                foreach (var item in list)
                {
                    stack.Push(item);
                }
            }
            else
            {
                yield return current;
            }
        }
    }

主要的优点是返回对象,并且可以由其他对象处理。缺点是潜在的拳击,你可以避免这种额外的检查,但是如果列表中包含不同的对象,你需要考虑行为。

它总是一个嵌套列表,或者它可以是任何可枚举的吗?在结尾会发生什么?就这么玩?然后简单地检查当前项是否是IEnumerable并枚举它。递归地。@Sinatr显然会发生什么事,我想让它安静下来question@ZoharPeled可以假设它总是一个列表。或者更短,使用is-iftheList是IEnumerable enu{…}else{theList?.ToString}。。。
void StringFromPossibleList(object theList)
{
    var enu = theList as IEnumerable;
    if(enu!=null)
    {
        foreach(var item in enu)
        {
            StringFromPossibleList(item);
        }
    }
    else
    {
        theList.ToString();
    }
}
    public static IEnumerable<object> FlattenNestedLists(object obj)
    {
        var stack = new Stack();
        stack.Push(obj);
        while (stack.Count > 0)
        {
            var current = stack.Pop();
            if (current is IEnumerable list)
            {
                foreach (var item in list)
                {
                    stack.Push(item);
                }
            }
            else
            {
                yield return current;
            }
        }
    }