【问题标题】:Looping through an array without throwing exception循环遍历数组而不抛出异常
【发布时间】:2010-10-02 14:20:22
【问题描述】:

假设我有一个值数组:

string[] text = new string[] { "val1", "val2", "val3", "val4", "val5" };

然后我有一个基本循环:

for (int i = 0; i <= 30; i++)
{
    Console.WriteLine(i + " = " + text[i])
}

显然,这会导致越界异常,所以我想要做的是当计数器到达数组的上限时,然后返回开始。

所以

0 = val1    
1 = val2    
2 = val3    
3 = val4    
4 = val5    
5 = val1    
6 = val2    
7 = val3    
etc..

【问题讨论】:

    标签: c# arrays loops


    【解决方案1】:

    你可以使用模运算符:

    Console.WriteLine(i + " = " + text[i % 5])
    

    【讨论】:

    • 最好使用 text.Length,但无论如何 +1 ;-p
    • (应该是文本[i % 5],当然)
    • 非常感谢,数组的名称是我的错,我在编辑之前将 string[i] 放在了我的帖子中。
    • 应该是 text[i % text.length] 并且您可能希望将 30 更改为 text.length * 6。这样将来如果您添加一个元素就不必找到这些数字并更改它们。
    • 修复了数组名,谢谢。我什至不知道 C#(我知道 C/C++)所以我没有太注意代码(只是从问题中复制粘贴)。
    【解决方案2】:

    取数组长度的模数:

    for (int i = 0; i < 30; ++i)
    {
        Console.WriteLine(i + " = " + text[i % text.Length]);
    }
    

    【讨论】:

    • 至少在这里您使用的是 Length 属性,而不是硬编码文本数组的长度。
    【解决方案3】:

    试试

    for(int i=0;i<=30;i++)
    {
        Console.WriteLine(i + " = " + string[i % 5])
    }
    

    【讨论】:

      【解决方案4】:

      不应该是:

      Console.WriteLine(i + " = " + text[i % text.length])
      

      ?

      【讨论】:

        【解决方案5】:

        作为一个不太具体的解决方案...

        class Program
        {
            static void Main(string[] args)
            {
                string[] text = new string[] { "val1", "val2", "val3", "val4", "val5" };
        
                int count = 0;
                foreach (string t in text.ContinuousLoopTo(30))
                {
                    Console.WriteLine(count.ToString() + " = " + t);
                    count++;
                }
        
                Console.ReadLine();
            }
        }
        
        public static class Extensions
        {
            public static IEnumerable<T> ContinuousLoopTo<T>(this IList<T> list, int number)
            {
                int loops = number / list.Count;
        
                int i = 0;
        
                while (i < loops)
                {
                    i++;
        
                    foreach (T item in list)
                    {
                        yield return item;
                    }
                }
        
                for (int j = 0; j < number % list.Count; j++)
                {
                    yield return list[j];
                }
            }
        }
        

        【讨论】:

        • 有点过度设计,但我喜欢它:) +1
        • 当然可以,但是过度工程可能很有趣:-P
        【解决方案6】:

        什么?像永远一样?

        bool run = true;
        int i = 0;
        string[] text = new string[] {"val1", "val2", "val3", "val4", "val5"};
        while(run)
        {
           Console.WriteLine(i + " = " + text[i])
           i++;
           if(i>=text.Length) i=0;
        }
        

        【讨论】:

          【解决方案7】:

          写行应该是:

          Console.WriteLine(i + " = " + text[i%5]);
          

          【讨论】:

          • 我明白你的意思,我被打了大约30秒;-)
          • 大声笑 - dayam - 我今天不玩了!不过,我已经获得了当天的 200 分,所以当很明显 100 人将在几秒钟内获得这一分时,我什至不应该跳到这里。
          • 我放弃了..."不应该 BE 跳到这里来。伙计,我要去睡觉了:-/
          猜你喜欢
          • 2013-03-17
          • 2013-04-04
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          相关资源
          最近更新 更多