【问题标题】:C# Array "circle"C# 数组“圆”
【发布时间】:2012-07-08 11:29:00
【问题描述】:

我有一个数组:

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

当盒子出现在数组的最后一个值上时,程序会继续不工作,如何让它在一个“圆圈”内工作?

谢谢大家!

【问题讨论】:

    标签: c# arrays counter


    【解决方案1】:

    这应该可行:

    
    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
    • 如果有两个按钮:NextButton 和 PreviousButton,当您单击 NextButton 时 - 您将看到数组中的下一个值;当您单击 PreviousButton - 您将看到以前的值,但如果第一个值显示数组,并且您单击 PreviousButton - 将是一个错误。如果显示最后一个值,则单击上一个按钮如何制作。 “圈”正好相反?谢谢!
    【解决方案2】:
    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 &lt; -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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2016-04-06
      相关资源
      最近更新 更多