C# 如何递归遍历嵌套泛型集合?
我想计算嵌套集合中类的数量,例如:[[1,2],[3,4,5],[[1,2],[3,4,5]]。这里引用的类是“int”,预期的答案是10 我将此列表生成为: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.
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
};