2016-07-04 6 views
1

私は、リスト内の配列で構成されたジャーナルを作成しています。配列はすべて新しいエントリであり、リストはジャーナルです。ここでは、私がこれまでにそれを解決するために試した方法は次のとおりです。string []リスト内で問題が発生しました

using System; 
using System.Collections.Generic; 
using System.Linq;     

namespace Journal 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int menuChoice = 0; 
      List<string[]> journal = new List<string[]>(); 

      while (menuChoice != 4) 
      { 
       Console.WriteLine("\n\t\t===Journal==="); 
       Console.WriteLine("\t[1] New entry in the journal"); 
       Console.WriteLine("\t[2] Search entry in the journal"); 
       Console.WriteLine("\t[3] Show contents of the journal"); 
       Console.WriteLine("\t[4] Exit"); 
       Console.Write("\tChoose: "); 

       int.TryParse(Console.ReadLine(), out menuChoice); 
       { 
        switch (menuChoice) 
        { 
         case 1: 
          { 
           string[] entry = new string[3]; 
           DateTime time = DateTime.Now; 
           entry[0] = Convert.ToString(time); 
           Console.Write("\n\tWrite your title: "); 
           entry[1] = Console.ReadLine(); 
           Console.Write("\n\tWrite your new entry: "); 
           entry[2] = Console.ReadLine(); 
           journal.Add(entry); 
          } 
          break; 
         case 2: 
          Console.Write("\n\tSearch entry in the journal: "); 
          string searchTerm = Console.ReadLine(); 
          for (int i = 0; i < journal.Count; i++) 

           if (journal[i].Contains(searchTerm)) 
           { 
            Console.WriteLine(journal[i]); 
           } 
           else 
           { 
            Console.WriteLine("\n\tYour search was not found."); 
           } 
          break; 
         case 3: 
          Console.WriteLine("\n\tJournal:"); 
          foreach (string[] item in journal) 
           Console.WriteLine("\n\t" + item); 
          break; 
         case 4: 
          break; 
        } 
       } 
      } 
     } 
    } 
} 

、私はそれはまだない、この仕事をしようと、トラブルの多くを、持っていました。私がしようとしているのは、配列内の3つのインデックススペースを時間、タイトル、テキストに使い分け、それらを組み合わせてリストに入れて、タイトルを検索するときに来るようにすることですグループとして

ジャーナルを宣言するときに通常の文字列リストを使用しようとしましたが、挿入するインデックスを指定しなくてもその配列を追加することはできません。リストの型を文字列[]に変更すると、foreachループは文字列[]を文字列に変換できないため、foreachループ内の文字列を文字列[]に変更することができますすべてを書き出しようとすると、「System.String []」と検索されます。

私は今どこにいるのですか。誰かが私に何が間違っているか教えてもらえれば、私がこれをどのように解決できるかを示すことができれば大いに感謝します。

+0

検索用語が含まれているタイトルの最初のエントリを検索するには:のための検索語を含むタイトルを持つすべてののエントリを検索するには

var selected = journal.FirstOrDefault(item => item[1].Contains(searchTerm)); if (selected != null) { // selected is the first string[] with a title containing the search term. Console.WriteLine(String.Join("\r\n", result)); } 

このために文字列配列を使うのではなく、 'JournalEntry'クラスを作成することをお勧めします。 'entry.Time'、' entry.Title'、 'entry.Content'と' entry [0] '、' entry [1] 'と' entry [2]コードでは、 '。 –

+0

'string.Contains'ではなく、' Enumerable.Contains'(配列、リストなどのコレクションで動作するLinqメソッド)を呼び出すことにも注意してください。これにより、タイトルまたはコンテンツに検索語が含まれているかどうかを調べるのではなく、エントリの時間、タイトルまたはコンテンツが、指定された検索用語と正確に等しいかどうかを検索する検索が行われます。 '' abc ".Contains(" b ")'はtrueを返しますが、 '(new string [] {" abc "})を返します。Contains( "b") 'は、その配列に' 'b" '文字列が含まれていないため、falseを返します。 –

答えて

0

journalは、文字列配列のリストです。 journal[i]は文字列の配列です。文字列配列の値を出力するには、その配列をループする必要があります。

if (journal[i].Contains(searchTerm)) 
{ 
    for (int j = 0; j < journal[i].Count; j++) 
     Console.WriteLine(journal[i][j]); 
} 

またはLINQを使用してforeach

foreach(string item in journal[i]) 
    Console.WriteLine(item); 
0

として、あなたはサブリストのリストから1つのリストを得ることができる:

foreach(var item in journal.SelectMany(x => x)) 
{ 
    // item is string 
} 

あなたはもちろんのusing System.Linq;を追加する必要があります。

0

問題を解決する最も簡単な方法は、TitleDate、そしてBodyプロパティを持つJournalEntryクラスを作成することです。そのクラスでは、ToStringをオーバーライドして、書式付き出力を生成できます。

クラスを作成せずに、この問題を解決する最も簡単な方法は、少量のLINQを適切に適用することです。 String.Joinを使用して、文字列配列をConsole.WriteLineの単一の文字列に結合することもできます。私は「

var selected = journal.Where(item => item[1].Contains(searchTerm)); 
foreach (var result in selected) 
{ 
    // result is the string[] journal entry 
    Console.WriteLine(String.Join("\r\n", result)); 
} 
関連する問題