2016-12-10 7 views
3

私はログブックを学校の課題として取り組んでおり、私は以下に示すようになっています。私は実装が必要ないくつかのことで苦労していますが、私の最大の関心事は、リスト内に配列が必要な理由を理解することです。リストに配列があるのはなぜですか? C#

私が使用するように言われています:

List logBook = new List { }; 
string[]post = new string [2] 

機能は、私は、少なくともタイトルとメッセージを表示して、新しい投稿を保存できるようにすると仮定してるということです。ログブックはリストであり、各ログは配列であると考えられます。

私の質問は、正しい方向に向いていて、誰かがリスト内の配列でなければならない理由を理解できるように助けてくれますか?また、searchpartについては、正しい方向に私を助けてください。私は、日付、タイトル、または投稿内の単語を検索することができます。

static void Main(string[] args) { 
    string titel; 
    string post; 
    string[] logg = new string[20]; 

    List<string[]> logBook = new List<string[]> { }; 
    DateTime tiden = DateTime.Now; 
    Console.WriteLine(tiden.ToShortDateString()); 

    bool go = true; 

    while (go) 
     try 
     { 
      Console.WriteLine("\n\tWelcome to the Logbook!\n"); 
      Console.WriteLine("\t[1] Write a new post"); 
      Console.WriteLine("\t[2] Search for a post"); 
      Console.WriteLine("\t[3] Display all posts"); 
      Console.WriteLine("\t[4] Quit"); 
      Console.Write("\n\tSelect from menu: "); 

      int menyVal = Convert.ToInt32(Console.ReadLine()); 
      int i = 0; 

      switch (menyVal) 
      { 
       case 1: 
        Console.WriteLine("\tWrite a title to your post: "); 
        titel= Console.ReadLine(); 

        Console.WriteLine("\n\tWrite your post: "); 

        Console.WriteLine("\t" + tiden.ToShortDateString() + "\n"); 
        Console.WriteLine("\t" + titel + "\t"); 
        post = Console.ReadLine(); 
        logg[i] = tiden.ToShortDateString() + "\n" + titel + "\n" + post + "\n"; 
        logBook.Add(logg); 
        i = i + 1; 
        break; 

       case 2: 
        Console.WriteLine("\tWrite a searchword or a date (yyyy-mm-dd)"); 
        string keyword = Console.ReadLine(); 

        foreach (var item in logBook) 
        { 
         if (logg[i] == keyword) 
          Console.WriteLine(logg[i]); 
         else 
          Console.WriteLine("Searchword couldn't be found."); 
        } 
        break; 

       case 3: 
        Console.WriteLine("\tThese are the current posts in Logbook.\n "); 
        foreach (string[] element in logBook) 
        { 
         Console.WriteLine("\t" + element); 
        } 

        break; 

       default: 
        Console.WriteLine("\tChoose from menu 1 - 4"); 
        break; 

       case 4: 
        go = false; 
        break; 
      } 
     } 
     catch 
     { 
      Console.WriteLine("\tChoose from menu 1 - 4"); 
     } 
    } 
} 
+0

申し訳ありませんが、それを行うことができるかもしれない...ログaswellを除去した後、ログを変更するが、私は与えたいと思いましたそれはすべてのことについてのヒントです。 – Tarbh

答えて

0

dasblinkenlightのように、クラスを使用する方が良いです。だから私は彼に完全に同意するでしょう。


しかし....あなたの解決策です。あなたのリストと配列に問題があります。

実装方法は、文字列とリストの配列を使用しています。フォーマットされた文字列全体を配列の要素の1つとして記述しています。そして配列全体をリストに追加します。したがって、リストの各項目は同じ配列です。

あなたの投稿を読む限り、リスト項目ごとに新しい配列が必要です。私は、例えばコードの一部をとりました:

switch (menyVal) 
{ 
    case 1: 
     Console.WriteLine("\tWrite a title to your post: "); 
     // i'd rather declare the string here, so the code and declaration should stick together. (it's not the pascal language ;-)) 
     string titel= Console.ReadLine(); 

     Console.WriteLine("\n\tWrite your post: "); 

     Console.WriteLine("\t" + tiden.ToShortDateString() + "\n"); 
     Console.WriteLine("\t" + titel + "\t"); 
     post = Console.ReadLine(); 

     // here comes the thing: 
     // you are formatting it as one element and add that element to the list. 
     // ->> wrong >> logg[i] = tiden.ToShortDateString() + "\n" + titel + "\n" + post + "\n"; 
     // ->> logBook.Add(logg); 

     // create an array per item.... 
     string[] arr = new string[2]; 
     arr[0] = title; 
     arr[1] = post; 

     logBook.Add(arr); 

     // i = i + 1; not needed. 
     break; 

グローバルlogg配列が必要とされていないこの道を..リストが追加配列への参照を維持します。


これは間違っています...ログブック(配列のリスト)を繰り返して、同じログ項目を何度もチェックしています。

van anyFound = false; 

foreach (var item in logBook) 
{ 
    foreach(var element in item) 
    { 
     if(element == keyword) 
     { 
      foreach(var s in item) 
      { 
       Console.Write(s); 
      } 
      Console.WriteLine(""); 
      anyFound = true; 
     } 
    } 
    if(!anyFound) 
     Console.WriteLine("Searchword couldn't be found."); 
} 

またはショートで:

foreach (var item in logBook) 
{ 
    if (logg[i] == keyword) 
     Console.WriteLine(logg[i]); 
    else 
     Console.WriteLine("Searchword couldn't be found."); 
} 

あなたが探していることである(i変数は決して変更されません)

var foundIn = logBook.Where(item => item.Contains(keyword)); 

foreach(var elements in foundIn) 
    Console.WriteLine(string.Join(" ", elements); 

詳細に尋ねること自由に感じ

+0

u Jeroen van Langenにたくさんのことを、私はまっすぐ私をまっすぐにしました。あなたがuの前にそれを見るとき、それはとても明らかです。 今、各投稿に日付が必要な場合は、arr [2] = timeのような独自の配列を作成する方が簡単です。 arr を延長するか、タイトルの横に置くことができますか? 検索エンジンをより良くするには? – Tarbh

+0

各ログ項目の日時を格納します。 'DateTime.ToString()'メソッドを使う必要があります。なぜ文字列配列を使うべきではなく、代わりにクラスを使うべきなのでしょうか。 datetimeを文字列に格納する際の問題は、それをロケールに固定することです。文化特有のフォーマット。また、フォーマットしないと秒のような情報を失うことになります。 **あなたはこの練習のために試してみるかもしれませんが、クラスはより良い練習であることを覚えておいてください。** –

+0

私は確信しています。私はsearchpartとdateの実装にちょうど苦労しています。私はなぜクラスを使うべきなのかをすべて示しています。それは私かもしれませんが、投稿を編集して特定の投稿を削除することもできるように求められているので、クラスが手元にあり、私のformar質問が立っているようです.....なぜ配列をリストに入れるのですか? ....私が見ることができるのは、本当に配列要素のすべての値をリストの文字列にロックしていることです。 – Tarbh

3

List<T>を使用するアイデアは正しいです。タイトルとメッセージの2つの文字列の配列を使用するというアイデアは正しくありません。

C#では配列をリストに格納できますが、2要素配列の格納に関する問題は、これらの配列の内容が対称でないことです。logBook[i][0]は常にタイトルで、logBook[i][1]は常にメッセージです。

TitleMessage特性を持つ、ポストのためのクラスを作成し、配列の代わりにそれを使用する方が良いでしょう:

class LogPost { 
    public string Title { get; set; } 
    public string Message { get; set; } 
} 

List<LogPost>がたくさん読みやすくList<string[]>よりも、それはすることができますlogBook[i].TitlelogBook[i].Messageにもっと読みやすい方法でアクセスします。

+0

Thx、2要素配列を実装して試してみましょう。私はクラスを作ることに同意しますが、配列内のリストを使用すると思われます。 – Tarbh

0

これは私がしていなくても終わりに来たものです編集して事をolvedか、それが書かれていたりしても、私は明日:)悪いと、不完全なコードのための

List<string[]> logBook = new List<string[]> { }; 
     DateTime time = DateTime.Now; 
     Console.WriteLine("\t" + time.ToShortDateString()); 
     Console.WriteLine("\n\tWelcome to the Logbook!\n"); 

     bool go = true; 

     while (go) 
      try 
      { 
       { 
        Console.WriteLine(""); //Skapar ny rad. Användaren ska inte känna att det blandar ihop sig. 
        Console.WriteLine("\t[1] Write a new post"); 
        Console.WriteLine("\t[2] Search for a post"); 
        Console.WriteLine("\t[3] Display all posts"); 
        Console.WriteLine("\t[4] Quit"); 

        Console.Write("\n\tSelect from menu: "); 

        int menu = Convert.ToInt32(Console.ReadLine()); //Gör om inmatad sträng till heltal. 
        Console.WriteLine(""); //Skapar mellanrum innan nästa direktiv till användaren (Estetiskt). 

        switch (menu) 
        { 
         case 1: 

          string timeDate = time.ToShortDateString(); 

          Console.Write("\tWrite a title to your post: "); 
          string title = Console.ReadLine(); 

          Console.Write("\n\tPost is created " + timeDate + "\n\n\tWrite your post: "); 

          //Console.WriteLine("\t" + timeDate + "\n"); 
          //Console.WriteLine("\t" + title + "\n\t"); 
          string post = Console.ReadLine(); 

          string[] arr = new string[3]; 
          arr[0] = timeDate; 
          arr[1] = title; 
          arr[2] = post; 

          logBook.Add(arr); 
          break; 

         case 2: 
          Console.Write("\tWrite a searchword or a date (yyyy-mm-dd): "); 
          string keyword = Console.ReadLine(); 
          Console.WriteLine(""); 

          bool anyFound = false; 

          foreach (string[] item in logBook) //För varje element(item) i Listan(logBook) dvs (arr[i]) 
          { 
           foreach (string element in item) //För varje element(element) i arr[i] dvs (arr[0], arr[1], arr[2]) 
           { 
            if (element.Contains(keyword)) // Om arr[0], arr[1] eller arr[2] innhåller sökord.... 
            { 
             foreach (string s in item) // Skriv ut varje arr[i] i det elementet(item) (dvs hela den loggen) 
             { 
              Console.WriteLine("\t" + s); 
             } 
             Console.WriteLine(""); 
             anyFound = true; 
            } 
           } 
          } 
          if (!anyFound) 
           Console.WriteLine("\tSearchword couldn't be found."); 
          break; 

         case 3: 
          Console.WriteLine("\tThese are the current posts in Logbook.\n "); 

          foreach (var item in logBook) //För varje element(item) i Listan(logBook) dvs (arr[i]) 
          { 
           foreach (string element in item) //För varje element(element) i arr[i] dvs (arr[0], arr[1], arr[2]) 
           { 
            Console.WriteLine("\t" + element); 
           } 
            Console.WriteLine(""); 
          } 
          break; 

         default: 
          Console.WriteLine("\tChoose from menu 1 - 4"); 
          break; 

         case 4: 
          go = false; 
          break; 
        } 
       } 
      } 
      catch 
      { 
       Console.WriteLine(""); //Estetisk för att användaren ska få ny rad innan meddelandet. 
       Console.WriteLine("\tChoose from menu by using number 1 - 4"); //Aktiveras om användaren knappar in annat än heltal. 
      } 
関連する問題