2017-10-26 8 views
-4

私は学校プロジェクトのログを保存するプログラムを作成しました。私は実際にいくつかの助けに感謝する2つの質問があります。リスト内のC#配列

  1. 2つの文字列を含む配列をリストに上書きしないでリストに保存するにはどうすればよいですか?私が今行ってきたやり方は、新しいリストをリストに追加するのではなく、最初の配列を上書きします。

  2. ディクショナリを使用せずにリスト内の配列を検索する最も簡単な検索アルゴリズムは何ですか?

私の最初の質問のコードは、最初のswitch文で見つけることができます。あなたの出力データ配列postないあなたは以上のforeach item:ケース2で

public void Loggbok() 
    { 
     bool isRunning = true; 

     //List and the Array inside the list that the user can save logs into 
     List<string[]> loggBok = new List<string[]>(); 

     string[] post = new string[2] { "Title", "Entry" }; 

     //While loop with all the user interaction 
     while (isRunning) 

     { 
      //The menu that the user can type 1-5 in order to make a option 
      Console.WriteLine("\n\tWelcome to the logbook.\n\tPlease type a number between 1-5.\n"); 
      Console.WriteLine("\t[1]Create a log to the logbook"); 
      Console.WriteLine("\t[2]Display all the current logs saved"); 
      Console.WriteLine("\t[3]Search the logbook "); 
      Console.WriteLine("\t[4]Erase all logs "); 
      Console.WriteLine("\t[5]Quit "); 
      Console.Write("\tChoose a number: "); 

      //Take userinput & convert into a number with TryParse 
      string MenuOption = Console.ReadLine(); 
      int userNumber; 
      int.TryParse(MenuOption, out userNumber); 





      //Take userNumber and let number 1-5 start the switch 
      switch (userNumber) 
      { 

       case 1: 
        { // Save a new log 
         Console.Clear(); 

         //Let the user type a title to the log 
         Console.Write("Titel: "); 
         post[0] = Console.ReadLine(); 

         //Let the user type a entry and then save it to the array inside the list 
         Console.Write("Entry: "); 
         post[1] = Console.ReadLine(); 

         loggBok.Add(post); 


         Console.Clear(); 



         break; 
        } 
       case 2: 
        { 
         //Show all the saved logs with a foreach loop 
         Console.Clear(); 
         foreach (var item in loggBok) 
         { 
          Console.WriteLine("\nTitel: " + post[0] + "\nEntry: " + post[1]); 
         } 

         Console.Write("\nPress any key to get back to the main meny.\n"); 
         Console.ReadLine(); 
         Console.Clear(); 
         break; 

        } 

       case 3: 
        { 

         break; 
        } 


       case 4: 
        { 
         //Reset all logs 
         Console.Clear(); 
         loggBok.Clear(); 
         Array.Clear(post, 0, post.Length); 
         Console.WriteLine("Erasing all logs... Done."); 
         Console.Write("\n\nPress any key to get back to the main meny.\n"); 
         Console.ReadLine(); 
         Console.Clear(); 

         break; 
        } 
       case 5: 
        { 
         //Closing the app 
         Console.Clear(); 
         Console.WriteLine("Thanks for using the app, goodbye! "); 
         isRunning = false; 
         Console.ReadLine(); 

         break; 
        } 

       default: 
        { 

         // Tell the user to type 1 - 5 
         Console.Clear(); 
         Console.WriteLine("Something went wrong. Choose a number between 1-5."); 
         Console.ReadLine(); 
         Console.Clear(); 

         break; 

        } 
      } 

     } 

    } 



    /* 
     Main method 
     This Run Class creates a new instance so that the loggProgram is being called upon. 
     Then it starts the program in a new instance. 
    */ 

    class Run 
    { 
     static void Main(string[] args) 
     { 
      new loggProgram().Loggbok(); 
     } 
    } 
+1

move string [] post =新しい文字列[2] {"Title"、 "Entry"}; whileループに追加します。上書きを停止します –

+3

1つの質問のみをお願いします。[**最小限、完全で、検証可能な例](https://stackoverflow.com/help/mcve) – Stijn

+0

Alex Krupkaに感謝します。私はあなたのアドバイスで試してみましたが、残念ながら私の問題を解決していないようです。これは配列内の前の文字列を上書きし続けます – Nebula

答えて

0

そして真剣に、あなたのコードについて考え、f.e:(これはrefaktoringのためのちょうどスタートです):

public enum EOptions 
{ 
    None, // automatically 0, others increase by 1 so they "work" with your menue 

    AddEntry, // 1 
    ShowAll, // 2 
    SearchEntry, // 3 
    ClearAll, // 4 
    Quit, // 5 
} 

public class loggProgram 
{ 
    public void Loggbok() 
    { 
     bool isRunning = true; 

     //List and the Array inside the list that the user can save logs into 
     var loggBok = new List<Entry>(); 

     //While loop with all the user interaction 
     while (isRunning) 

     { 
      //The menu that the user can type 1-5 in order to make a option 
      PrintMenue(); 

      //Take userinput & convert into a number with TryParse 
      string MenuOption = Console.ReadLine(); 

      // about the same as parsing to in but more "readable" 
      if (!Enum.TryParse<EOptions>(MenuOption, out var option)) 
      { 
       Console.WriteLine($"Unsupported input: {MenuOption}"); 
       Console.ReadLine(); 
       Console.Clear(); 
       continue; 
      } 

      //Take userNumber and let number 1-5 start the switch 
      switch (option) 
      { 
       case EOptions.AddEntry: 
        AddEntry(loggBok); 
        break; 

       case EOptions.ShowAll: 
        //Show all the saved logs with a foreach loop 
        PrintAllLogs(loggBok); 
        break; 

       case EOptions.SearchEntry: 
        Console.WriteLine("Still have to implement searching...."); 
        break; 

       case EOptions.ClearAll: 
        //Reset all logs 
        ClearAllLogs(loggBok); 
        break; 

       case EOptions.Quit: 
        //Closing the app 
        isRunning = QuitApp(); 
        break; 

       default: 
        // Tell the user to type 1 - 5 
        PrintUnhandledIntegerInputMessage(); 
        break; 
      } 
     } 
    } 

    private static void AddEntry(List<Entry> loggBok) 
    { 
     // Save a new log 
     Console.Clear(); 

     Entry entry = new Entry(); 
     //Let the user type a title to the log 
     Console.Write("Titel: "); 
     entry.Title = Console.ReadLine(); 

     //Let the user type a entry and then save it to the array inside the list 
     Console.Write("Entry: "); 
     entry.Log = Console.ReadLine(); 

     loggBok.Add(entry); 

     Console.Clear(); 
    } 

    private static void ClearAllLogs(List<Entry> loggBok) 
    { 
     Console.Clear(); 
     loggBok.Clear(); 
     Console.WriteLine("Erasing all logs... Done."); 
     Console.Write("\n\nPress any key to get back to the main meny.\n"); 
     Console.ReadLine(); 
     Console.Clear(); 
    } 

    private static void PrintAllLogs(List<Entry> loggBok) 
    { 
     Console.Clear(); 
     foreach (var item in loggBok) 
     { 
      Console.WriteLine($"Titel: {item.Title}"); 
      Console.WriteLine($"Entry: {item.Log}\n"); 
     } 

     Console.Write("\nPress any key to get back to the main meny.\n"); 
     Console.ReadLine(); 
     Console.Clear(); 
    } 

    private static void PrintMenue() 
    { 
     Console.WriteLine("\n\tWelcome to the logbook.\n\tPlease type a number between 1-5.\n"); 
     Console.WriteLine("\t[1]Create a log to the logbook"); 
     Console.WriteLine("\t[2]Display all the current logs saved"); 
     Console.WriteLine("\t[3]Search the logbook "); 
     Console.WriteLine("\t[4]Erase all logs "); 
     Console.WriteLine("\t[5]Quit "); 
     Console.Write("\tChoose a number: "); 
    } 

    private static void PrintUnhandledIntegerInputMessage() 
    { 
     Console.Clear(); 
     Console.WriteLine("Something went wrong. Choose a number between 1-5."); 
     Console.ReadLine(); 
     Console.Clear(); 
    } 

    private static bool QuitApp() 
    { 
     bool isRunning; 
     Console.Clear(); 
     Console.WriteLine("Thanks for using the app, goodbye! "); 
     isRunning = false; 
     Console.ReadLine(); 
     return isRunning; 
    } 
} 

public class Run 
{ 
    /* 
     Main method 
     This Run Class creates a new instance so that the loggProgram is being called upon. 
     Then it starts the program in a new instance. 
    */ 

    static void Main(string[] args) 
    { 
     new loggProgram().Loggbok(); 
    } 
} 

struct Entry 
{ 
    public string Log; 
    public string Title; 
} 
+0

マジックナンバーの代わりにenums、string []の代わりにstruct、それらが何をしているのかを示す小さな関数。あなたは本当にこれのためのクラスのインスタンスを必要としない、あなたは完全な静的とロールすることができますが、私はあなたがこれを強化すると思います –

+0

私のコードを整理して時間を取ってくれてありがとう、本当に感謝私の先生はまだそれに焦点を当てていない。うまくいけば、ある日、私は誰にも肩をすくめないようなコードを書くつもりです。私はまだ線形探索を書こうとしていますが、自分で解くことができなければ私はあなたに戻ってきます。 – Nebula

1

まず、UnholySheepさんのコメントはstructまたはclassがより適しているであろう、正しいです。

しかし、配列を使用してコードを修復するために、あなたはいくつかの変更を行う必要があります。

  1. まず、あなたのcase 1:postのあなたの宣言を移動します。あなたはそれをあなたのリストに加えることができるように作成します、それだけです。
  2. のでConsole.WriteLine("\nTitel: " + item[0] + "\nEntry: " + item[1]);
  3. は述べた別の答えとしてcase 4:
+0

ありがとう!今それは動作します。今度は検索アルゴリズムを書くつもりです – Nebula

1

postを使用して行全体を削除するよう、itemcase 2:postをご参照を交換して、アイテムが毎回上書きなっている理由はあなたのためでありますwhileループの前にpostオブジェクトを宣言します。したがって、変更するたびに同じものを変更しています。

これを修正するには、宣言をcase 1ブロックに移動するだけです。この方法で、毎回新しい配列を作成し、それをリストに追加します。

しかし、あなたは最高クラスにあなたのコードを壊す考えるかもしれません:。Logを表し1、およびList<Log>やリストを管理するために必要なすべてのメソッドが含まれている(LogBookを表し、1を

例えば、 Logクラスは次のようになります。

public class Log 
{ 
    public string Title { get; set; } 
    public DateTime Date { get; set; } 
    public string Entry { get; set; } 

    public Log() { } 

    public Log(string title, string entry) 
    { 
     Title = title; 
     Entry = entry; 
     Date = DateTime.Now; 
    } 

    public override string ToString() 
    { 
     return $"\tTitle: {Title}\n\tDate : {Date.ToShortDateString()}\n\tEntry: {Entry}"; 
    } 
} 

そして、ログブッククラスからの入力を収集するために適切な方法とメニューと一緒に、これらのログのプライベートリストを持っているでしょう:我々はまた、ToString()メソッドをオーバーライドしてきたので、それが自分自身を表示する方法を知っているに注意してください彼らはログブックを管理できるようにするユーザー:

public static class LogBook 
{ 
    private static List<Log> logs = new List<Log>(); 

    public static void Run() 
    { 
     do 
     { 
      MainMenu(); 
     } while (ExecuteCommand(GetCommandFromUser())); 
    } 

    private static void MainMenu() 
    { 
     DisplayMenuHeader("Main Menu"); 
     Console.WriteLine("\t[1] Create a log to the logbook"); 
     Console.WriteLine("\t[2] Display all the current logs saved"); 
     Console.WriteLine("\t[3] Search the logbook"); 
     Console.WriteLine("\t[4] Delete all logs"); 
     Console.WriteLine("\t[5] Quit\n"); 
    } 

    private static void DisplayMenuHeader(string menuName) 
    { 
     Console.Clear(); 
     Console.WriteLine("\n\n\tWelcome to the LogBook!"); 
     Console.WriteLine("\t-----------------------"); 
     Console.WriteLine($"\n\t{menuName}\n"); 
    } 

    private static bool ExecuteCommand(int commandId) 
    { 
     switch (commandId) 
     { 
      case 1: 
       AddLog(); 
       break; 
      case 2: 
       DisplayLogs(); 
       break; 
      case 3: 
       SearchLogs(); 
       break; 
      case 4: 
       DeleteLogs(); 
       break; 
      case 5: 
       return false; 
     } 

     return true; 
    } 

    private static void AddLog() 
    { 
     DisplayMenuHeader("Add New Log Entry"); 
     var title = GetInputFromUser("\tEnter log title: "); 
     var entry = GetInputFromUser("\tEnter log entry: "); 
     logs.Add(new Log(title, entry)); 
    } 

    private static string GetInputFromUser(string message) 
    { 
     Console.Write(message); 
     return Console.ReadLine(); 
    } 

    private static void DisplayLogs(string searchTerm = "") 
    { 
     var menuName = string.IsNullOrWhiteSpace(searchTerm) 
      ? "Existing Logs" 
      : "Search Results"; 

     DisplayMenuHeader(menuName); 

     if (logs == null || !logs.Any()) 
     { 
      Console.WriteLine("\tThere are no log entries."); 
     } 
     else 
     { 
      var matchingLogs = logs.Where(log => 
       log.Title != null && log.Title.Contains(searchTerm) || 
       log.Entry != null && log.Entry.Contains(searchTerm)) 
       .ToList(); 

      if (!matchingLogs.Any()) 
      { 
       Console.WriteLine($"\tNo log entries contain the search term: '{searchTerm}'."); 
      } 
      else if (!string.IsNullOrEmpty(searchTerm)) 
      { 
       Console.WriteLine($"\tThe following entries contain the search term, '{searchTerm}':\n"); 
      } 

      Console.WriteLine(string.Join("\n\t----------\n", matchingLogs)); 
     } 

     Console.Write("\n\tPress any key to return to the Main Menu..."); 
     Console.ReadKey(); 
    } 

    private static void SearchLogs() 
    { 
     DisplayMenuHeader("Search Log Entries"); 
     var searchTerm = GetInputFromUser("\tEnter search term: "); 
     DisplayLogs(searchTerm); 
    } 

    private static void DeleteLogs() 
    { 
     DisplayMenuHeader("Delete Logs"); 
     logs.Clear(); 
     Console.WriteLine("\tAll log entries have been deleted."); 
     Console.Write("\n\tPress any key to return to the Main Menu..."); 
     Console.ReadKey(); 
    } 

    private static int GetCommandFromUser() 
    { 
     string input; 
     int commandId; 

     do 
     { 
      Console.Write("\tEnter a number from 1 - 5: \b"); 
      input = Console.ReadKey().KeyChar.ToString(); 
      Console.CursorLeft = 0; 
     } while (!int.TryParse(input, out commandId) 
      || commandId < 1 || commandId > 5); 

     Console.WriteLine("\n"); 
     return commandId; 
    } 
} 

使用

LogBookクラスの使い方は非常に簡単です - ちょうどを呼び出します:

static void Main() 
{ 
    LogBook.Run(); 
} 
関連する問題