C#数组“圆圈”

时间:2012-07-08 11:29:01

标签: c# arrays counter

我有一个数组:

class Words
{
   public static string[] wordsArray = { "one", "two", "three", "four" };
}

显示值数组的TextBlock,以及显示数组下一个值的按钮:

private int counter = 0;

    private void goButton_Click(object sender, RoutedEventArgs e)
    {

        if (counter < Words.wordsArray.Length)
        {
            enWordTextBlock.Text = Words.wordsArray[counter++];
        }
    }

如果该框出现在数组的最后一个值上,程序将继续不起作用,如何使其在“圆圈”中工作?

全部谢谢!

2 个答案:

答案 0 :(得分:6)

这应该有效:


private void goButton_Click(object sender, RoutedEventArgs e)
{
    counter++; //increase the counter
    int i = counter % Words.wordsArray.Length; //modulo operation
    enWordTextBlock.Text = Words.wordsArray[i]; //set text
}

答案 1 :(得分:3)

private int counter = 0;

private void goButton_Click(object sender, RoutedEventArgs e)
{
    enWordTextBlock.Text = Words.wordsArray[counter++ % Words.wordsArray.Length];
}



[编辑]
好的,这是与user1397396评论相关的编辑。我不确定我是否正确理解你,但你可能会遇到负值模数的问题。例如:

int counter = 0;
int mod = 4;
counter--; // counter is -1 after this line is executed
int result = counter % mod; // result is -1
result = (counter + mod) % mod; // result is now 3 as desired



以下是我将如何实现这些Next和Previous按钮。

private int counter = 0;

private void NextButton_Click(object sender, RoutedEventArgs e)
{
    enWordTextBlock.Text = Words.wordsArray[counter % Words.wordsArray.Length];
    counter++; // put ++ operator in new line to avoid confusion
}

private void PreviousButton_Click(object sender, RoutedEventArgs e)
{
    int wordCount = Words.wordsArray.Length;
    // add wordCount before applying modulus (%) to avoid negative results
    // -1 % 5 = -1; -2 % 5 = -2; -6 % 5 = -1 etc
    // negative values would cause exception when accessing array
    counter = ((counter - 1) + wordCount) % wordCount; 
    enWordTextBlock.Text = Words.wordsArray[counter];
}

例如,这段代码会导致按下Next,Previous,Next来给你:“one”,“four”,“one”。


更好的解决方案是使用方法(或内联代码),例如:

private static int GetPositiveIntModulus(int value, int mod)
{
    return ((value % mod) + mod) % mod;
}

即使在value < -mod时,它也会为任何值提供积极的结果。所以你可以像这样编写上面的代码:

private int counter = 0;

private void NextButton_Click(object sender, RoutedEventArgs e)
{
    // uncomment this to ensure valid counter
    // if it is changed somewhere else in the program
    //counter = GetPositiveIntModulus(counter, Words.wordsArray.Length);
    enWordTextBlock.Text = Words.wordsArray[counter];
    counter = GetPositiveIntModulus(counter + 1, Words.wordsArray.Length);
}

private void PreviousButton_Click(object sender, RoutedEventArgs e)
{
    counter = GetPositiveIntModulus(counter - 1, Words.wordsArray.Length);
    enWordTextBlock.Text = Words.wordsArray[counter];
}