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



我想创建一个函数

void StringFromNestedList<T>(T theList);

列表可以是以下类型:

List<List<List<List<double>>>>
List<List<int>>
List<List<List<SomeCustomType>>>

等等。

假设对于每个元素,我想激活一个假定所有元素都具有的功能,例如ToString()

如果我知道嵌套的数量和每个列表的大小,例如 2 个级别,每个级别 4 个元素,我会做类似的事情

for (var i = 0; i < 4; i++)
{
for (var j = 0; j < 4; j++)
{
theList[i][j].ToString(); // yes, it doesnt really do anything
}
}

但我不知道需要多少个 for 循环。

可行吗?

我不确定尝试使其通用是否会为您带来任何好处。

所以,首先假设它只需要一个object

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;
}
}
}

主要优点是返回对象,并且可以由其他内容处理。缺点是潜在的装箱,您可以通过额外的检查来避免这种情况,但如果列表包含不同的对象,则需要考虑该行为。

最新更新