我有一个数组:
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++];
}
}
如果该框出现在数组的最后一个值上,程序将继续不起作用,如何使其在“圆圈”中工作?
全部谢谢!
答案 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];
}