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

本文关键字:不同的事 迭代 循环 | 更新日期: 2023-09-27 18:06:10

我正在为Sifteo Cubes上的儿童制作一款游戏。我试着把一个句子一个字一个字地装到立方体上。我对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添加到第一个包装器,依此类推。

任何帮助将不胜感激!

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

您可以这样做:

String[] words = new String[] {w1,w2,w3,w4,w5};
foreach (CubeWrapper wrapper in mWrappers) 
{
   wrapper.setWord(words[i++]);
}

此解决方案是有效的,但请记住,如果words数组小于mWrappers集合,您将收到IndexOutOfBoundsException。所以同步对数组的访问现在是你的工作了

如果你不能/不想改变你的类,那么你可以使用反射来做这样的事情(尽管这可能不是正确的事情在这里):

foreach (CubeWrapper wrapper in mWrappers) {   
    var name = "w" + (i+1).ToString();
    var value = this.GetType().GetProperty(name).GetValue(this);
    wrapper.setWord(value);
}

的例子:

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();

您可以使用random类从数组中获取一个随机单词,如下所示…

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