我正在尝试练习一个简单的场景,其中涉及自动创建嵌套的 foreach 语句。该方法要做的就是获取传递给该方法的 int 值,并基于此,它应该自动创建嵌套的 foreach 语句。
public static String[] ValuesAdd1 = { "a", "b", "c" };
public static String[] ValuesAdd2 = { "1", "2", "3" };
static int count = 2;
public void ConutNumber(int count)
{
count = Program.count;
if (count.Equals(""))
{
Console.WriteLine("Empty element, please add");
}
else
{
//create nested foreach statement using count value
Console.WriteLine(count);
Console.ReadLine();
}
}
一个例子是这样的,上面的元素是 2,因此总共应该创建嵌套 2 个 foreach 语句,如下所示:
foreach(var i in ValuesAdd1)
{
foreach(var ii in ValuesAdd1)
{
Console.writeline(i, ii);
}
}
非常感谢您的专业反馈。
如果不需要将 ValuesAddX 分开,您可以有一个数组数组,然后对其进行 foreach:
public static string[][] ValuesAdd =
{
new [] { "a", "b", "c" },
new [] { "1", "2", "3" },
new [] { "x", "y", "z" },
};
public void NestedForeach()
{
// Note that count isn't required anymore as we're using
// ValuesAdd.Length as the count
NestedForeachRecursive(string.Empty, 0);
}
public void NestedForeachRecursive(string prefix, int depth)
{
foreach (var item in ValuesAdd[depth])
{
var nextDepth = depth + 1;
var nextPrefix = prefix + item;
if (nextDepth < ValuesAdd.Length)
NestedForeachRecursive(nextPrefix, nextDepth);
else
Console.WriteLine(nextPrefix);
}
}
请注意,由于您要迭代每个其他项目的每个项目,因此其性能会非常差。
这个例子的输出是:
a1x
a1y
a1z
a2x
a2y
a2z
a3x
a3y
a3z
b1x
b1y
b1z
b2x
... and so on
你应该使用递归:
public void ConutNumber(int count)
{
...
GoThroughElements(count);
...
}
public void GoThroughElements(int count, List<String> recurseValues = new List<String>())
{
foreach(String value in ValuesAdd1)
{
recurseValues.Add(value);
if(count == 1)
{
// In deepest recursion iterate through the line of values
foreach(String i in recurseValues)
Console.WriteLine(i);
}
else if(count > 1)
{
GoThroughElements(--count, recurseValues);
}
else
{
throw new Exception("Wrong count!");
}
}
}
不要忘记检查计数中是否存在无效值。使用递归时要小心,如果不注意错误的情况,很容易导致内存问题。