C# 在循环c的每次迭代中做不同的事情#

C# 在循环c的每次迭代中做不同的事情#,c#,sifteo,C#,Sifteo,我正在为孩子们制作一个游戏。我试着一个字一个字地在立方体上加载一个句子。我对Sifteo立方体有一些经验,但我如何才能以更漂亮的方式解决这个问题?如果可能的话,更通用 foreach (CubeWrapper wrapper in mWrappers) { if (i == 0) { wrapper.setWord (w1); } else if (i == 1) { wrapper

我正在为孩子们制作一个游戏。我试着一个字一个字地在立方体上加载一个句子。我对Sifteo立方体有一些经验,但我如何才能以更漂亮的方式解决这个问题?如果可能的话,更通用

foreach (CubeWrapper wrapper in mWrappers) {
            if (i == 0) { 
                wrapper.setWord (w1);
            } else if (i == 1) {
                wrapper.setWord (w2);
            } else if (i == 2) {
                wrapper.setWord (w3);
            } else if (i == 3) {
                wrapper.setWord (w4);
            } else if (i == 4) {
                wrapper.setWord (w5);
            }
            i++;
        }
我将始终将w1添加到第一个包装中,以此类推


任何帮助都将不胜感激

您可以执行以下操作:

String[] words = new String[] {w1,w2,w3,w4,w5};

foreach (CubeWrapper wrapper in mWrappers) 
{
   wrapper.setWord(words[i++]);
}

此解决方案正在运行,但请记住,如果
单词
数组小于
mWrappers
集合,您将收到
索引自动边界异常
。因此,同步对阵列的访问现在是您的工作。

您可以执行以下操作:

String[] words = new String[] {w1,w2,w3,w4,w5};

foreach (CubeWrapper wrapper in mWrappers) 
{
   wrapper.setWord(words[i++]);
}

此解决方案正在运行,但请记住,如果
单词
数组小于
mWrappers
集合,您将收到
索引自动边界异常
。因此,同步对阵列的访问现在是你的工作。

如果你不能\不想更改你的类,那么你可以使用反射来做类似的事情(,即使这可能不是正确的做法)):

例如:

public class ABC
{
    public int w1 { get; set; }
    public int w2 { get; set; }
    public int w3 { get; set; }

    public ABC()
    {
        w1 = 7;
        w2 = 8;
        w3 = 9;
    }

    public void DoSomething()
    {
        var i = 1;
        var name = "w" + (i + 1).ToString(); // w2
        var value = (int)this.GetType().GetProperty(name).GetValue(this);
        DoSomething(value);
    }

    public void DoSomething(int curr)
    {
        Console.WriteLine(curr); // 8
    }
}
用法:

ABC abc = new ABC();
abc.DoSomething();

如果您不能\不想更改您的类,那么您可以使用反射来执行类似的操作(,即使在这里这样做可能不是正确的操作):

例如:

public class ABC
{
    public int w1 { get; set; }
    public int w2 { get; set; }
    public int w3 { get; set; }

    public ABC()
    {
        w1 = 7;
        w2 = 8;
        w3 = 9;
    }

    public void DoSomething()
    {
        var i = 1;
        var name = "w" + (i + 1).ToString(); // w2
        var value = (int)this.GetType().GetProperty(name).GetValue(this);
        DoSomething(value);
    }

    public void DoSomething(int curr)
    {
        Console.WriteLine(curr); // 8
    }
}
用法:

ABC abc = new ABC();
abc.DoSomething();

你可以从数组中得到一个随机词,使用像这样的随机类

        String[] words = new String[] { "w1", "w2", "w3", "w4", "w5" };
        Random r = new Random(0);
        int randomNumber = r.Next(0, words.Length);

        foreach (CubeWrapper wrapper in mWrappers)
        {
            wrapper.setWord(words[randomNumber]);
        }

你可以从数组中得到一个随机词,使用像这样的随机类

        String[] words = new String[] { "w1", "w2", "w3", "w4", "w5" };
        Random r = new Random(0);
        int randomNumber = r.Next(0, words.Length);

        foreach (CubeWrapper wrapper in mWrappers)
        {
            wrapper.setWord(words[randomNumber]);
        }

哇,你确定反思是一个实用的解决方案吗?我认为这就像用大炮在苍蝇上射击一样。@ckruczek-1。它在不进行代码重构的情况下解决了这个问题(你不可能总是这样做)。2.你的解决方案也不是最好的解决方案。因为如果一个w变量的值发生变化,那么你的数组将具有以前的值。当然,我并不是说我的解决方案是最好的。但你的两个都不是。如果变量名的名称从“w”更改为其他名称,则必须进行代码重构。尽管如此,变量命名始终会导致
w2
。反射在这里绝对不是一个适用的解决方案。但是话说回来,我们都可能是错的,因为OP没有很好地指定他的领域哇,你确定反思是一个实用的解决方案吗?我认为这就像用大炮在苍蝇上射击一样。@ckruczek-1。它在不进行代码重构的情况下解决了这个问题(你不可能总是这样做)。2.你的解决方案也不是最好的解决方案。因为如果一个w变量的值发生变化,那么你的数组将具有以前的值。当然,我并不是说我的解决方案是最好的。但你的两个都不是。如果变量名的名称从“w”更改为其他名称,则必须进行代码重构。尽管如此,变量命名始终会导致
w2
。反射在这里绝对不是一个适用的解决方案。但是话说回来,我们都可能是错的,因为OP没有很好地指定他的领域