C# 如何递归遍历嵌套泛型集合?

C# 如何递归遍历嵌套泛型集合?,c#,.net,generics,recursion,icollection,linq,C#,.net,Generics,Recursion,Icollection,Linq,我想计算嵌套集合中类的数量,例如:[[1,2],[3,4,5],[[1,2],[3,4,5]]。这里引用的类是“int”,预期的答案是10 我将此列表生成为: List<int> list1 = new List<int>(2); list1.Add(1); list1.Add(2); List<int> list2 = new List<int>(3); list2.

我想计算嵌套集合中类的数量,例如:[[1,2],[3,4,5],[[1,2],[3,4,5]]。这里引用的类是“int”,预期的答案是10

我将此列表生成为:

        List<int> list1 = new List<int>(2);
        list1.Add(1);
        list1.Add(2);
        List<int> list2 = new List<int>(3);
        list2.Add(3);
        list2.Add(4);
        list2.Add(5);

        List<List<int>> listlist = new List<List<int>>(2);
        listlist.Add(list1);
        listlist.Add(list2);

        List<List<List<int>>> listlistlist = new List<List<List<int>>>(2);
        listlistlist.Add(listlist);
        listlistlist.Add(listlist);
然后我就有问题了

        ICollection<T> subTCol = pT as ICollection<T>;   //PROBLEM: I got "null" for subTCol when the program was running

我该怎么做呢?

ICollection subcol=pT作为ICollection//问题:我得到了subcol的“null”

此值为空的原因是
pT
不是
i集合
,因为
T
int
listlist
列表
。因此,
pT
是一个
列表
,这就是为什么如果您尝试将其强制转换为
ICollection
,您将得到null

我想计算嵌套集合中的项目数。

使用的
Sum
方法可以更轻松地完成此操作。如果您知道嵌套级别,例如:

Assert.AreEqual(10, listlistlist.Sum(x => x.Sum(y => y.Count)));
如果您不知道嵌套级别或需要更通用的方法,可以创建一个扩展方法,如:

public static class RecursiveSumExtension
{
    public static int RecursiveSum(this IEnumerable items)
    {
        if (null == items)
            return 0;

        var total = 0;

        foreach (var item in items)
        {
            if (item is IEnumerable)
                total += (item as IEnumerable).RecursiveSum();

            else
                total++;
        }

        return total;
    }
}
以及测试:

 Assert.AreEqual(10, listlistlist.RecursiveSum());
列表生成

顺便说一句,在创建集合时,可以使用的集合初始值设定项语法使代码更具可读性:

        var listlist = new List<List<int>>
        {
            new List<int> {1, 2},
            new List<int> {3, 4, 5}
        };

        var listlistlist = new List<List<List<int>>>
        {
            listlist,
            listlist
        };
var listlist=新列表
{
新名单{1,2},
新名单{3,4,5}
};
var listlist=新列表
{
列表,
列表
};

你总是有三个级别,还是一个任意数量的级别?在我的实际问题中,我只有两个级别,但我想实现一个通用方法,也就是说,我想有一个可以处理任意数量级别的方法。我建议,对于任意数量的级别,适当的数据结构是树,对于这个类,算法要简单得多。树是否意味着一个基于树的类,比如
SortedSet
?我看不出树在我的问题上有什么好处。你能举个例子来说明优势吗?我需要使用System.Collections添加
IEnumerable
,请在类的顶部使用code>。
Assert.AreEqual(10, listlistlist.Sum(x => x.Sum(y => y.Count)));
public static class RecursiveSumExtension
{
    public static int RecursiveSum(this IEnumerable items)
    {
        if (null == items)
            return 0;

        var total = 0;

        foreach (var item in items)
        {
            if (item is IEnumerable)
                total += (item as IEnumerable).RecursiveSum();

            else
                total++;
        }

        return total;
    }
}
 Assert.AreEqual(10, listlistlist.RecursiveSum());
        var listlist = new List<List<int>>
        {
            new List<int> {1, 2},
            new List<int> {3, 4, 5}
        };

        var listlistlist = new List<List<List<int>>>
        {
            listlist,
            listlist
        };