自动创建嵌套的foreach语句

问题描述 投票:0回答:2

我正在尝试练习一个简单的场景,其中涉及自动创建嵌套的 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);
     }
}

非常感谢您的专业反馈。

c# selenium-webdriver foreach iterator auto
2个回答
2
投票

如果不需要将 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

2
投票

你应该使用递归:

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!");
        }
    }
}

不要忘记检查计数中是否存在无效值。使用递归时要小心,如果不注意错误的情况,很容易导致内存问题。

© www.soinside.com 2019 - 2024. All rights reserved.