C#遍历数组

21

我正在循环遍历一个字符串数组,例如 (1/12/1992 苹果 卡车 12/10/10 橘子 自行车)。该数组的长度总是可以被3整除的。我需要循环遍历该数组,获取前3个项目(我将把它们插入到数据库中),然后获取接下来的3个项目,依此类推,直到所有项目都被遍历完毕。

//iterate the array
for (int i = 0; i < theData.Length; i++)
{
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3.
}

2
在40秒内提交了5个答案,所有答案都包含几乎相同的信息。哈哈,不错。 - JasCav
2
我觉得有趣的是,在我写这篇文章的时候,已经有五个答案发布了...但是没有一个正确地得出了上限。 - Michael Myers
1
正如@Mahesh所说:你没有提出问题。问题通常以问号(?)结尾。你没有描述你尝试过什么,失败了什么,以及为什么你遇到困难。 - abelenky
有人在滥用踩的功能吗...? - froadie
@Matt - 在每次迭代(增加3),theData[i] 应该是你的日期,theData[i+1] 应该是你的水果类型,而 theData[i+2] 应该是你的汽车。有什么问题吗? - froadie
对于初始数组,怎么样使用一个foreach循环呢?不知道为什么没有人提出这个建议。 - undefined
7个回答

26

每次都将i增加3:

  Debug.Assert((theData.Length % 3) == 0);  // 'theData' will always be divisible by 3

  for (int i = 0; i < theData.Length; i += 3)
  {
       //grab 3 items at a time and do db insert, 
       // continue until all items are gone..
       string item1 = theData[i+0];
       string item2 = theData[i+1];
       string item3 = theData[i+2];
       // use the items
  }
为了回答一些评论,theData.Length 是3的倍数是已知的,所以没有必要检查 theData.Length-2 是否是上限。这样做只会掩盖先决条件中的错误。

10

i++ 是循环的标准用法,但不是唯一的方式。尝试每次增加3:

 for (int i = 0; i < theData.Length - 2; i+=3) 
    { 

        // use theData[i], theData[i+1], theData[i+2]

    } 

3
到目前为止,你是唯一一个在最后一次迭代中不会出现越界错误的人;相反,你会提前停止一次迭代。请尝试使用 i < theData.Length - 2 - Michael Myers
@mmyers - 英雄所见略同。 :) 我已经改了。但我认为检查并不必要,只是因为似乎很合乎逻辑... - froadie
4
题目说明长度将是 3 的倍数,无需减去 2。 - H H
@Henk:你说得对;如果我给你的回答点了踩,我会收回。不过你可能需要在你的回答中强调这一点。 - Michael Myers
有什么原因导致这些回答被踩吗?似乎每个回答都收到了踩的评价。 - froadie

4

不太难。只需在每次迭代中将for循环的计数器增加3,然后偏移索引器以一次获取3个批处理即可:

for(int i=0; i < theData.Length; i+=3)
{
    var item1 = theData[i];
    var item2 = theData[i+1];
    var item3 = theData[i+2];
}

如果数组的长度不能保证是三的倍数,那么你需要使用theData.Length - 2来检查上限。


3

你的for循环不必只加一。你可以循环三次。

for(int i = 0; i < theData.Length; i+=3)
{
  string value1 = theData[i];
  string value2 = theData[i+1];
  string value3 = theData[i+2];
}

基本上,您只是使用索引来获取数组中的值。这里需要注意一点,我没有检查您是否超出了数组的末尾。请确保进行边界检查!


踩?为什么?(我注意到除了第一个答案,其他所有答案都被踩了。很无聊。) - JasCav
第一个似乎原本存在,但现在已经被删除了。很奇怪。 - froadie

2
以下是更通用的解决方案:
int increment = 3;
for(int i = 0; i < theData.Length; i += increment)
{
   for(int j = 0; j < increment; j++)
   {
      if(i+j < theData.Length) {
         //theData[i + j] for the current index
      }
   }

}

2

这应该可以工作:

//iterate the array
for (int i = 0; i < theData.Length; i+=3)
{
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3.
    var a = theData[i];
    var b = theData[i + 1];
    var c = theData[i + 2];
}

我曾经因为这个答案被downvote过一次,我相信这很可能与使用theData.Length作为上限有关。由于题目中保证了array的长度是三的倍数,所以现在这段代码可以正常工作。但如果没有这个保证,你就需要用theData.Length - 2来检查上限。


-4
string[] friends = new string[4];
friends[0]= "ali";
friends[1]= "Mike";
friends[2]= "jan";
friends[3]= "hamid";

for (int i = 0; i < friends.Length; i++)
{
    Console.WriteLine(friends[i]);
}Console.ReadLine();

1
这个问题已经有多个答案和一个被接受的答案了。您能否通过编辑您的答案来解释您的答案与其他答案的区别?同时请注意,仅有代码的答案从长远来看是没有用处的。 - 7uc1f3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接