2016-07-01 6 views
0

私はコーディングとC#で非常に新しいので、作成しているプログラムで助けが必要です。 これは学校の割り当てであり、私はそれを動作させることができません。C#リストからの配列の出力

プログラムはシンプルで、ログブック(リスト)があり、新しいログを作成できるはずです(各ログは個別の配列でなければなりません)。私はその部分を解決しましたが、その後、特定のログを検索することができます(ログの正確なタイトル、00を検索するだけで)、リスト内のすべてのログ(配列)も印刷できるはずです(0,00,01,02,1,00,01,02など)

私はいくつかのことを試しましたが、うまく動作しません。私の特定の問題の解決策を見つけるのは難しいです。それを探しているだけです。

{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //List & Array\\ 
     List<string[]> loggBok = new List<string[]> { }; 
     string[] newEntry = new string[3]; 

     //Variabler\\ - Variabler för sökord och Tid&Datum 
     string searchTerm = ""; 
     DateTime time = DateTime.Now; 

     Console.WriteLine("\tVälkommen till Charlies loggbok."); 


     //Bool & While loop\\ 
     bool isRunning = true; 
     while (isRunning) 

      try 
      { 
       { //Loop start 

        //Meny\\ 
        Console.WriteLine("\n\t[1] Skriv ett nytt inlägg i loggboken"); 
        Console.WriteLine("\t[2] Sök efter inlägg i loggboken"); 
        Console.WriteLine("\t[3] Skriv ut alla loggar i loggboken"); 
        Console.WriteLine("\t[4] Rensa bort all text"); 
        Console.WriteLine("\t[5] Avsluta programmet"); 

        Console.Write("\n\tVälj siffra: "); 

        //Switch\\ 
        int menyVal = Convert.ToInt32(Console.ReadLine()); 
        switch (menyVal) 


        { 
         case 1: 
          Console.WriteLine("\nDu har valt att skriva in ett nytt inlägg."); 
          //string[] newEntry = new string[3]; 


          //Nytt inlägg\\ 
          Console.Write("Skriv in titeln: "); 
          newEntry[0] = Console.ReadLine(); 

          Console.Write("Skriv in meddelandet: "); 
          newEntry[1] = Console.ReadLine(); 

          time = DateTime.Now; 
          var entryTime = Convert.ToString(time); 
          newEntry[2] = entryTime; 

          loggBok.Add(newEntry); 

          Console.WriteLine("\nInlägget är sparat i loggboken"); 
          break; 

         case 2: 
          Console.WriteLine("\nVänligen skriv in titelt på inlägget för att söka fram det."); 
          Console.Write("\nSök efter: "); 

          searchTerm = Console.ReadLine(); 

          var foundItem = false; 

          foreach (var item in loggBok) 
          { 
           if (item.Contains(searchTerm)) 
           { 
            foundItem = true; 
            Console.WriteLine(item); 
           } 
          } 



          if (!foundItem) 
          { 
           Console.WriteLine("Kunde inte hitta inlägget du sökt efter."); 
          } 

          break; 

         case 3: 
          foreach (var item in loggBok) 
          { 
           Console.WriteLine(item); 
          } 
          break; 

         case 4: 
          Console.Clear(); 
          Console.WriteLine("\tFönstret är nu rensat."); 
          break; 

         case 5: 
          Console.WriteLine("\n\tHej då!"); 
          System.Threading.Thread.Sleep(2000); 
          isRunning = false; //bool är falskt och stänger då av programmet (avslutar loopen) 
          break; 


         default: 
          Console.Clear(); //Rensar konsolfönstret 
          Console.WriteLine("Felaktig inmatning, skriv en siffra från menyn"); 
          break; 

        } 
       } //Loop slut 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("\nNågot gick fel!"); 
       Console.WriteLine(e); 
      } 
    } 
} 
} 

これまでのプログラム全体であり、ケース2と3が問題を抱えています。現在そのケースに入っているコードは機能しません。

ケース2は検索機能です。私は1つ以上の配列を追加する場合、最後のものだけを見つけることができますが、出力は "System.String []"(配列を2つ追加すると2回表示されます)

3はprint-all関数です。すべての配列を出力しますが、出力は各配列の "System.String []"だけです。

ありがとうございます。

+1

ちょっとしたヒント。学習の段階で 'var'を使わないようにしましょう。あなたの変数のタイプについても考えていなくても、あなたを助けません。 – pijemcolu

+0

私は通常、変数に適切な型を使用しますが、この場合はvarに変更する必要があります。私はvar、string、intよりも私の学習のほうがずっと進んでいないし、entryTime変数は文字列やintを型として受け入れないだろう。 – Kaliber123

+0

'var entryTime = Convert.ToString(time);'文字列変数。悪いことは何もありません。私は、明示的な型の使用がはるかに適切であることを指摘しています。 – pijemcolu

答えて

0

このようなネストループを使用する必要があります。

foreach (var item in loggBok) 
{ 
    foreach (var s in item) 
     Console.WriteLine(s); 
} 
break; 

さらに多くのシーンで同じことをします。私はcase:3のためにそれをやった。それが役に立てば幸い。

+0

これは、私が必要としていた基本的でシンプルなコードと、割り当ての残りのコードの使い方を合わせたものです。今、検索と "すべてを書く"機能が完璧に動作しています、ありがとう。 – Kaliber123

0

ここで問題となるのは、構造を十分に深く掘り下げていないということです。そうそう思います。

-List 
    -Array(of type string) 
     -string 
     -string 
     -string 

だからあなたforeachループで、あなたはこの結果を得ている理由です実際の配列オブジェクトを返すためにそれを求めています。

ちょっとレベルを上げて、必要に応じて出力をフォーマットしてください。

foreach (var item in loggBok) 
{ 
    Console.WriteLine(string.Format("{0},{1},{2}", item[0], item[1], item[2]); 
} 
0

あなたはケース2のコード

のこの本格的な醜態を検討するかもしれない:

  List<string[]> loggBok = new List<string[]>(); 
     string searchTerm = Console.ReadLine(); 

     bool foundItem = false; 
     int index = 0; 

     do 
     { 
      string[] log = loggBok[index]; 
      if(log[0] == searchTerm) 
      { 
       foundItem = true; 
       Console.WriteLine("Found it."); 
      } 

     } while(foundItem == false && index > loggBok.Count); 

do{}while();の使用を参照してください、あなたは少なくとも一度ループを持っていますが、見つけるまでの間だけあなたがループ全体のコレクション全体をループするまで。 CASE3のため

:我々はループトラフにあなたのログを持って正確にどのように何回知っているよう

はここ
for (int i = 0; i < loggBok.Count; i++) 
     { 
      string firstEntry = loggBok[i][0]; 
      string secondEntry = loggBok[i][1]; 
      string thirdEntry = loggBok[i][2]; 

      Console.WriteLine(firstEntry + " , " + secondEntry + " , " + thirdEntry); 
     } 

我々は、forループを使用しています。