2015-11-23 2 views
0

Я использую цикл for в методе переноса результата в основную функцию. Я пытаюсь использовать цикл for, чтобы получить месяц в году и передать его на выход из основной функции.Использование цикла for при вызове метода

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

Выход возвращается «Не существует» в течение всех месяцев вместо того, чтобы выбирать соответствующий месяц. Как выбрать соответствующий месяц из цикла for или это возможно с тем, как я кодировал до сих пор?

namespace Month_Function_Call 
    { 
class Program 
{ 
    public static String month_name(int month) 
    { 
     String result; 
     result = "a"; 
     for (int i = 0; i < 12; ++i) 
     { 
      if (i == 0) 
      { 
       result = "January"; 
      } 
      if (i == 1) 
      { 
       result = "February"; 
      } 
      if (i == 2) 
      { 
       result = "March"; 
      } 
      if (i == 3) 
      { 
       result = "April"; 
      } 
      if (i == 4) 
      { 
       result = "May"; 
      } 
      if (i == 5) 
      { 
       result = "June"; 
      } 
      if (i == 6) 
      { 
       result = "July"; 
      } 
      if (i == 7) 
      { 
       result = "August"; 
      } 
      if (i == 8) 
      { 
       result = "September"; 
      } 
      if (i == 9) 
      { 
       result = "October"; 
      } 
      if (i == 10) 
      { 
       result = "November"; 
      } 
      if (i == 11) 
      { 
       result = "December"; 
      } 
      else 
      { 
       result = "N/A"; 
      } 


     } 
      return result; 
    } 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Month 1: " + month_name(1)); 
     Console.WriteLine("Month 2: " + month_name(2)); 
     Console.WriteLine("Month 3: " + month_name(3)); 
     Console.WriteLine("Month 4: " + month_name(4)); 
     Console.WriteLine("Month 5: " + month_name(5)); 
     Console.WriteLine("Month 6: " + month_name(6)); 
     Console.WriteLine("Month 7: " + month_name(7)); 
     Console.WriteLine("Month 8: " + month_name(8)); 
     Console.WriteLine("Month 9: " + month_name(9)); 
     Console.WriteLine("Month 10: " + month_name(10)); 
     Console.WriteLine("Month 11: " + month_name(11)); 
     Console.WriteLine("Month 12: " + month_name(12)); 
     Console.WriteLine("Month 43: " + month_name(43)); 
     Console.ReadKey(); 
    } 
} 
+4

Почему вы зацикливаете, а не просто сравниваете «месяц» в операциях 'if'? – juharr

+1

С какой проблемой вы сталкиваетесь? Какую помощь вы действительно ищете? Если его просмотр кода вы после этого, то codereview.stackexchange.com существует и может быть лучшим местом для вопроса (но только если ваш код действительно работает). – Chris

+2

Вам не нужен цикл в вашем методе, вам нужен цикл в 'Main', чтобы пройти месяц' 1' до '12'. Также загляните в «Словарь », чтобы вы могли получить подсказку 'if' в своем методе. Плюс уже есть методы, позволяющие получить имя месяца по числу. Последнее, что вам нужно, если ... else ... if', чтобы отсортировать неверный выбор, вы также можете использовать 'switch'. – Habib

ответ

5

Вы могли бы сделать этот очиститель с помощью switch

switch (month) 
     { 
      case 0: return "January"; 
      case 1: return "February"; 
      case 2: return "March"; 
      case 3: return "April"; 
      case 4: return "May"; 
      case 5: return "June"; 
      case 6: return "July"; 
      case 7: return "August"; 
      case 8: return "September"; 
      case 9: return "October"; 
      case 10: return "November"; 
      case 11: return "December"; 
      default: return "N/A"; 
     } 
4

ли что-то вроде этого вместо

string[] months = new string[12] {"January", "February", "March" }; // Input all months to this array 

if (index <= -1 || index > 12) return "N/A"; 
return months[index]; 

Вставьте этот код в getMonthName() функции

+0

Я видел ваш 43 тестовый чехол, позвольте мне отредактировать ответ, который подходит, хм. – TuukkaX

+0

Спасибо, что имеет бесконечный смысл, чем глупость, которую я печатал! Я знал, что это будет что-то простое, что я пропустил – Damo

+2

Просто сделайте 'return index> = 0 && index <12? month [index]: «N/A»; ' – juharr

7

Я думаю, что с помощью GetMonthName из DateTimeFormat будет лучшим способом сделать это. Это даст вам имя в активной культуре пользователей. (Вы можете, конечно, жестко кодировать это для любой культуры, которая вам нравится) Затем ToTitleCase, чтобы получить первый символ в качестве верхнего регистра.

public static String month_name(int month) 
{ 
    if(month < 1 || month > 12) 
     return "N/A"; 
    var culture = CultureInfo.CurrentCulture; 
    var name = culture.DateTimeFormat.GetMonthName(month); 
    return culture.TextInfo.ToTitleCase(name); 
} 
+2

Сначала ОП использует индекс, основанный на нулевом значении для имен месяцев, и используется 1. Во-вторых, это возвращает пустую строку для значения 13 и выдает исключение для значений меньше 1 и больше 13. – juharr

+0

@juharr действительная точка, но очень легко фиксируется. – Magnus

+0

@juharr Что касается индекса на основе нуля, который кажется неправильным в его функции, если вы посмотрите на его метод Main, он предполагает, что 1 будет первым месяцем. – Magnus

3

Не используйте петлю и если-еще. Вам нужен словарь.

static Dictionary<int, string> _monthName = new Dictionary<int, string> 
{ 
    {1,"January" }, // if zero based start from 0 
    {2,"February" }, 
    {3,"March" }, 
    {4,"April" }, 
    {5,"May" }, 
    {6,"June" }, 
    {7,"July" }, 
    {8,"August" }, 
    {9,"September" }, 
    {10,"October" }, 
    {11,"November" }, 
    {12,"December" }, 
}; 

private static string GetMonthName(int i) 
{ 
    var result = ""; 
    if (_monthName.TryGetValue(i, out result)) 
    { 
     return result; 
    } 
    return "N/A"; 
} 
static void Main(string[] args) 
{ 
    Console.WriteLine("Month 1: " + GetMonthName(1)); 
    Console.WriteLine("Month 2: " + GetMonthName(2)); 
    Console.WriteLine("Month 3: " + GetMonthName(3)); 
    Console.WriteLine("Month 4: " + GetMonthName(4)); 
    Console.WriteLine("Month 5: " + GetMonthName(5)); 
    Console.WriteLine("Month 6: " + GetMonthName(6)); 
    Console.WriteLine("Month 7: " + GetMonthName(7)); 
    Console.WriteLine("Month 8: " + GetMonthName(8)); 
    Console.WriteLine("Month 9: " + GetMonthName(9)); 
    Console.WriteLine("Month 10: " + GetMonthName(10)); 
    Console.WriteLine("Month 11: " + GetMonthName(11)); 
    Console.WriteLine("Month 12: " + GetMonthName(12)); 
    Console.WriteLine("Month 43: " + GetMonthName(43)); 
    Console.ReadKey(); 
} 
1

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

public static String month_name(int month) { 
     String result; 
     result = "a"; 
     // for the sake of readability I have split the line 
     String[] allMonths = { 
           "N/A", "January", "February", "March", "April", 
           "May", "June", "July", "August", "September", 
           "October", "November", "December" 
          }; 
     if (month >= 0 && month <= 12) 
      result = allMonths[month]; 
     else 
      result = "N/A"; 

     return result; 
    } 

    static void Main(string[] args) { 
     Console.WriteLine("Month 1: " + month_name(1)); 
     Console.WriteLine("Month 2: " + month_name(2)); 
     Console.WriteLine("Month 3: " + month_name(3)); 
     Console.WriteLine("Month 4: " + month_name(4)); 
     Console.WriteLine("Month 5: " + month_name(5)); 
     Console.WriteLine("Month 6: " + month_name(6)); 
     Console.WriteLine("Month 7: " + month_name(7)); 
     Console.WriteLine("Month 8: " + month_name(8)); 
     Console.WriteLine("Month 9: " + month_name(9)); 
     Console.WriteLine("Month 10: " + month_name(10)); 
     Console.WriteLine("Month 11: " + month_name(11)); 
     Console.WriteLine("Month 12: " + month_name(12)); 
     Console.WriteLine("Month 43: " + month_name(43)); 
     Console.ReadKey(); 
    } 

Надеется, что это помогло :)

0

Использования Swith-Case заявления является лучшим выбором здесь.

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

//for (int i = 0; i < 12; ++i) 
    //{ 

    //}