Цикл, хотя массив тогда, если и затем выходной результат? - PullRequest
0 голосов
/ 07 февраля 2011

У меня небольшая проблема, в приведенном ниже коде (C #) он зацикливает мысли на массивах, затем проверяет, имеет ли user_id значение user_post больше 50, затем записывает user_id, ожидаемый результат равен

12
13

но фактический результат равен

12
12
12

что не так с кодом?Я попробовал стандарт для цикла, но не смог получить его правильно?

int[] user_id = new int[64];
int[] group_id = new int[64];
int[] user_post = new int[64];

//user 55
user_id[0] = 10;
group_id[0] = 8;
user_post[0] = 4;

//user56
user_id[1] = 11;
group_id[1] = 2;
user_post[1] = 15;

//user57
user_id[2] = 12;
group_id[2] = 2;
user_post[2] = 55;

//user58
user_id[3] = 13;
group_id[3] = 2;
user_post[3] = 56;

foreach (int i in group_id)
{
    if (group_id[i] == 2)
        if (user_post[i] > 50)
            Console.WriteLine(Convert.ToString(user_id[i]));
}

Console.WriteLine("Press any key too continue...");
Console.ReadLine();
// continue...

Ответы [ 5 ]

1 голос
/ 07 февраля 2011

Потому что у вас есть оператор if, который проверяет только 2

 if (group_id[i] == 2)

, где «i» не является счетчиком вместо элемента из цикла foreach. и элементы на 2 и 3 позиции имеют 2 идентификатора группы, поэтому он всегда заканчивается следующим образом:

if (group_id[8] == 2) //false
if (group_id[2] == 2) //true
if (group_id[2] == 2) //true
<Ч />

Вместо этого расплывчатого кода у вас должен быть цикл:

for(int i = 0 ; i< 64 ; i++)
{
    if (group_id[i] == 2)
    {
        if (user_post[i] > 50)
        Console.WriteLine(Convert.ToString(user_id[i]));
    }

}
0 голосов
/ 07 февраля 2011

Синтаксис for выглядит следующим образом:

for (int i = 0; // incremental variable
     i < 100;   // determining a limit
     ++i)       // increment the variable

В то время как foreach работает следующим образом:

foreach (var element        // the element itself, not an index
         in
         elementCollection) // iterating through the collection
0 голосов
/ 07 февраля 2011

в вашем выражении foreach, i принимает значения, хранящиеся в вашем массиве group_id - 8, 2, 2, 2

В ваших if и выходных инструкциях вы используете это значение в качестве индекса для массивов

Итак, ваши if операторы в итоге делают следующее:

if(group_id[8])...
if(group_id[2])...
if(group_id[2])...
if(group_id[2])...

Вы проверяете только элементы 8 и 2 в своих массивах.

Использование цикла for для итерации по индексам массива

0 голосов
/ 07 февраля 2011

Вы перебираете неправильный массив с каждым оператором. Вы должны использовать цикл вместо обычного оператора for следующим образом:

    for (int i = 0;i < user_post.Length; i++)
    {
        if (user_post[i] > 50 && group_id[i] == 2)
        {
          Console.WriteLine(Convert.ToString(user_id[i]));
        }
    }
0 голосов
/ 07 февраля 2011
foreach (int i in group_id)

неверно, вы должны использовать:

for(int i = 0; i < group_id.Length; i++)

потому что с первым вы используете значения в group_id в качестве индексов ваших массивов.

Кстати, я бы посоветовал вам создать класс, например Info нравится:

class Info
{
   public int GroupId {get; set;};
   public int UserId {get; set;};
   public int PostId {get; set;}
}

это позволит вам создать только один массив (т.е. Info[]) и избежать возможных ошибок из-за разной длины 3 массивов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...