2016-07-04 2 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 индексных пространства в массиве для времени, заголовка и текста, а затем помещать эти 3 в список, чтобы они стали единым элементом в списке, поэтому, когда я ищу заголовок, который они приходят как группа.

Я пробовал использовать обычный список строк при объявлении журнала, но затем я не могу добавить в него массив, не указывая, какой индекс вставить. Когда я изменяю тип списка на строку [], петли foreach перестают работать, потому что они не могут преобразовать строку [] в строку, поэтому я меняю строку внутри цикла foreach на строку [], и теперь все Я получаю, когда пытаюсь написать все, или поиск - «System.String []».

Это в значительной степени, где я нахожусь прямо сейчас, поэтому, если кто-нибудь может сказать мне, что я делаю неправильно, или показать, как я могу это решить, мы будем очень благодарны.

+0

Я Рекомендуем создать класс 'JournalEntry', вместо этого использовать массив строк. Это сделает ваш код гораздо менее запутанным для работы с: 'entry.Time',' entry.Title' и 'entry.Content' versus' entry [0] ',' entry [1] 'и' entry [2] '. –

+0

Также обратите внимание, что вы не вызываете 'string.Contains', а' Enumerable.Contains' (метод Linq, который работает с такими коллекциями, как массивы, списки и т. Д.). Это приводит к тому, что поиск проверяет, соответствует ли время, заголовок или содержание записи точно данному термину поиска, а не проверяет, содержит ли заголовок или контент термин поиска. '" abc ".Contains (" b ")' возвращает true, тогда как '(новая строка [] {" abc "}).Содержит ("b") 'возвращает false, потому что этот массив не содержит строку' 'b" '. –

ответ

0

journal - список строк массивов. journal[i] - это массив строк. Чтобы распечатать значения в строковом массиве, вам необходимо пройти через этот массив.

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

Или как foreach

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

с помощью LINQ, вы можете дать один список из списка подсписков:

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

вам нужно добавить using System.Linq; конечно.

0

Самый простой способ решить эту проблему было бы создать JournalEntry класс с Title, Date и Body свойствами. В этом классе вы можете переопределить ToString для получения отформатированного вывода.

Не создавая класс, самый простой способ решить эту проблему - это разумное приложение небольшого количества LINQ. Вы также можете использовать String.Join, чтобы объединить массив строк в одну строку для Console.WriteLine.

Для поиска первой записи с заголовком, который содержит слово для поиска:

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

Для поиска все записи, которые имеют название, содержащее слово для поиска:

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)); 
} 
Смежные вопросы