2016-07-04 12 views
1

Ich erstelle ein Journal, das aus einem Array innerhalb einer Liste besteht, wobei das Array jeder neue Eintrag und die Liste das Journal ist. Hier ist, wie ich habe versucht, es zu lösen bisher:string [] innerhalb der Liste, die Probleme verursacht

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; 
        } 
       } 
      } 
     } 
    } 
} 

Ich habe sehr viel Mühe hat versucht, diese Arbeit zu machen, die es immer noch nicht. Was ich versuche zu tun ist, 3 Indexräume im Array für die Zeit, den Titel und den Text zu verwenden und dann diese 3 zusammen in die Liste zu setzen, so dass sie ein einzelnes Element in der Liste werden, wenn ich nach dem Titel suche als eine Gruppe.

Ich habe versucht, eine normale String-Liste zu verwenden, wenn ich das Journal deklariere, aber dann kann ich das Array nicht hinzufügen, ohne angeben zu müssen, welcher Index eingefügt werden soll. Wenn ich den Typ der Liste in eine Zeichenkette [] ändere, hören die foreach-Schleifen auf zu arbeiten, weil sie eine Zeichenkette [] nicht in eine Zeichenkette konvertieren können, also ändere ich die Zeichenkette innerhalb der foreach-Schleife in eine Zeichenkette [] und jetzt alle Bekomme ich wenn ich versuche alles aus zu schreiben oder suche ist "System.String []".

Das ist ziemlich genau, wo ich gerade bin, also wenn jemand mir sagen könnte, was ich falsch mache oder mir zeigen, wie ich das lösen kann, würde es sehr geschätzt werden.

+0

I‘ Es empfiehlt sich, eine 'JournalEntry'-Klasse zu erstellen, anstatt hierfür ein Zeichenfolgenarray zu verwenden. Es wird Ihren Code viel weniger verwirrend machen: 'entry.Time',' entry.Title' und 'entry.Content' gegenüber' entry [0] ',' entry [1] 'und' entry [2] '. –

+0

Beachten Sie auch, dass Sie nicht 'string.Contains' aufrufen, sondern' Enumerable.Contains' (eine Linq-Methode, die auf Auflistungen wie Arrays, Listen usw. angewendet wird). Dies bewirkt, dass bei einer Suche überprüft wird, ob die Zeit, der Titel oder der Inhalt eines Eintrags genau dem angegebenen Suchbegriff entspricht, anstatt zu prüfen, ob der Titel oder der Inhalt den Suchbegriff enthält. '" abc ".Contains (" b ")' gibt wahr zurück, während '(new string [] {" abc "}).Enthält ("b") 'gibt false zurück, weil dieses Array keine" b "-String enthält. –

Antwort

0

journal ist eine Liste von Strings-Arrays. journal[i] ist ein Array von Strings. Um die Werte in einem Zeichenfolgenarray auszugeben, müssen Sie dieses Array durchlaufen.

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

Oder als Linq foreach

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

verwenden, können Sie eine Liste aus einer Liste von Unterlisten ergeben:

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

Sie benötigen using System.Linq; natürlich hinzuzufügen.

0

Der einfachste Weg, um das Problem zu lösen, wäre eine JournalEntry Klasse mit Title, Date und Body Eigenschaften zu schaffen. In dieser Klasse können Sie ToString überschreiben, um eine formatierte Ausgabe zu erzeugen.

Ohne eine Klasse erstellen, ist der einfachste Weg zur Lösung dieses Problems mit der vernünftigen Anwendung einer kleinen Menge von LINQ. Sie können auch String.Join verwenden, um das String-Array in eine einzelne Zeichenfolge für zu kombinieren.

mit einem Titel für den ersten Eintrag zu suchen, die den Suchbegriff enthält:

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)); 
} 

für alle Einträge zu suchen, die einen Titel die den Suchbegriff enthalten haben:

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)); 
} 
Verwandte Themen