2016-05-22 2 views
0

Как написать код C#, который перечисляет значение массива объектов int 1-100 и выводить текст строки «EVEN», когда он обнаруживает, что объект, преобразованный в int, делится на 2?Как вывести «EVEN» для четных чисел от 1 до 100?

class Program 
{ 
    static void Main(string[] args) 
    { 
     object[] numbers = new object[100]; 

     numbers = Enumerable.Range(1, 100).Cast<object>().ToArray(); 


     foreach (object number in numbers) 
     { 
      if(Convert.ToInt32(number) % 2 == 0) 
      { 
       number.ToString().Equals("Even"); 
      } 
      Console.WriteLine(number); 
     } 
     Console.Read(); 
    } 
} 
+0

Почему бы не использовать int []? Упростите код уже много. И вы должны вывести «EVEN», а не сравнивать значение, например, 10 с «EVEN» – Bart

ответ

3

Проблемы у вас есть здесь:

number.ToString().Equals("Even"); 

Это становится строковым представление number, а затем сравнивая его равенство против строки Even и ничего не делать с результатом. Если вы сделаете шаг назад и подумаете об этом, это не имеет никакого смысла, потому что вы хотите напечатать Even, если number.

С вашей текущей программы, вы можете сделать это так:

if (Convert.ToInt32(number) % 2 == 0) 
{ 
    Console.WriteLine("{0} is even", number); 
} 

Тем не менее, есть несколько вещей, с вашей программой, что можно было бы улучшить, так как это не кажется, как будто вы все еще существовала система типа C#.

Во-первых, вы объявляете массив из 100 объектов, например, так:

object[] numbers = new object[100]; 

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

int[] numbers = new int[100]; 

Далее вы генерации последовательности целых чисел от 1 - 100:

numbers = Enumerable.Range(1, 100).Cast<object>().ToArray(); 

Enumerable.Range() возвращает набор целых чисел, а .ToArray() преобразует это в массив целых чисел. Как мы теперь используем массив целых чисел, нет никакой необходимости, чтобы бросить их в object, так что это может быть упрощена:

numbers = Enumerable.Range(1, 100).ToArray(); 

Существует еще одно упрощение, которое может быть сделано к этому. Enumerable.Range() возвращает IEnumerable<int>, который представляет собой набор целых чисел.Это означает, что вместо того, чтобы объявить массив из 100 целых чисел, генерируя набор чисел, преобразование тех, в массив, и назначая их numbers, мы можем сделать это вместо:

IEnumerable<int> numbers = Enumerable.Range(1, 100); 

Существует еще одно изменение, которое может быть сделал, но я опишу в конце этого ответа, так что давайте посмотрим на цикл:

foreach (object number in numbers) 
{ 
    if (Convert.ToInt32(number) % 2 == 0) 
    { 
     Console.WriteLine(number); 
    } 
} 

Как мы изменили код, чтобы использовать IEnumerable<int> вместо object[], теперь мы можем изменить декларацию из петля до:

foreach (int number in numbers) 

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

IEnumerable<Student> students = GetStudents(); 

Мы могли бы перебираем тех, как это:

foreach (Student student in students) 

Возвращаясь к вашей петле, теперь number является int, мы не» t должен преобразовать его из object в int, прежде чем мы сможем проверить, равномерное или нет. Поэтому код Петля может быть упрощена:

foreach (int number in numbers) 
{ 
    if (number % 2 == 0) 
    { 
     Console.WriteLine("{0} is even", number); 
    } 
} 

Главное, чтобы понять, что, когда вы уже знаете, какой тип вы хотите использовать, вы всегда должны использовать его всякий раз, когда вы можете, как это всегда будет упрощать код, который вы пишете. Полная программа будет выглядеть следующим образом:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IEnumerable<int> numbers = Enumerable.Range(1, 100); 

     foreach (int number in numbers) 
     { 
      if (number % 2 == 0) 
      { 
       Console.WriteLine("{0} is even", number); 
      } 
     } 
     Console.Read(); 
    } 
} 

Что касается других изменений я уже упоминал, ваш код поколения целого числа может быть упрощен:

var numbers = Enumerable.Range(1, 100); 

var ключевым слово делает использование implicit type inference для определения numbers type. Аналогичным образом, петлю можно было бы также изменить на:

foreach (var number in numbers) 

Я бы не стал беспокоиться о неявном выражении типа на данный момент. Я упомянул больше о полноте, но сначала вы должны научиться правильно использовать систему типов.

+0

OVER All Fix - это инструкция if-else. Большое спасибо за вашу помощь извините за поздний ответ. if (Convert.ToInt32 (number)% 2 == 0) { Console.WriteLine ("is even"); } else if (! (Convert.ToInt32 (number)% 2 == 0)) { Консоль.ЕЫпе (число); } – user3151548

+0

@ user3151548 Добро пожаловать, и никаких проблем. :) –

1

Ваш код почти правильно (для .Equals("Even") части). Ваш код внутри foreach может быть упрощена:

 Console.WriteLine(number.ToString() + ((Convert.ToInt32(number) % 2) == 0 ? " is even" : "")); 

}

+0

Привет, ffa. Я получаю синтаксическую ошибку: Console.WriteLine (number.ToString() + Convert.ToInt32 (число)% 2 = = 0? "Равно": ""); – user3151548

+0

Отредактированный пользователь3151548. Обратите внимание: если вы видите ошибку компиляции и можете ее исправить, не стесняйтесь редактировать сообщение. В противном случае, в том числе ошибки (-ы) в комментариях, может помочь решить проблему быстрее. – ffa

0

Проверьте это фрагменты кода.

class Program 
    { 
     static void Main(string[] args) 
     { 
     var stringBuilder = new StringBuilder(); 

     var numbers = new List<object>(); 
     numbers = Enumerable.Range(0, 100).Cast<object>  ().ToList();    
     foreach (var number in numbers) 
     { 
      if (Convert.ToInt32(number) % 2 == 0)    
       stringBuilder.Append("EVEN");     
      else 
       stringBuilder.Append(number); 
     } 

     Console.WriteLine(stringBuilder.ToString()); 
    } 
} 

Пожалуйста, дайте мне знать, если это сниппет могут решить ваши проблемы

+0

Вместо того, чтобы просто отправлять код, вы могли бы улучшить свой ответ, объяснив, что вы изменили и почему. –

+0

Спасибо, Ганс, поправил меня. –

Смежные вопросы