2016-11-13 1 views
0

Мой текущий код перебирает список, содержащий сохраненные строки в массиве. В настоящее время он ищет все строки в этом массиве. Я хочу изменить это так, чтобы он проходил только (поиск, поиск) для строк в «log [1]»C# как написать весь массив, если строка в «array [1]» содержит ключевое слово

Извините, я не знаю слова для «log [1]». Я новичок в программировании. Продолжайте читать, и я думаю, вы поймете.

Это, как я хочу сделать это:

foreach (string[] item[1] in loggbok) 

пункт [1] является журнал [1]. Номер 1 очень важен, потому что я хочу искать только в журнале [1].

Это мой текущий код для сохранения всего массива в моем списке:

List<string[]> loggbok = new List<string[]> { }; 
string[] log = new string[3]; //date, title, post 

DateTime date = DateTime.Now; 

log[0] = "\n\tDate: " + date.ToLongDateString() + " Kl: " + date.ToShortTimeString(); 
Console.WriteLine(log[0]); 

Console.Write("\tTitle: "); 
log[1] = "\tTitle: " + Console.ReadLine(); 

Console.Write("\tPost: "); 
log[2] = "\tPost: " + Console.ReadLine(); 

loggbok.Add(log); 
log = new string[3]; 

сохраняю "войти [1], журнал [2], журнал [3]"

Следующий код Я хочу сделать функцию поиска, которая проходит через мой список и распознает все строки в log [1] aka. Если заголовок строки содержит ключевое слово users, все журналы должны присоединиться, и журнал будет напечатан.

На данный момент. Я решил это, выполнив поиск по всем журналам (1,2,3). Это означает, что моя программа в настоящее время ищет строки внутри (заголовки, дата, сообщения). Это делает так, что вы можете искать сообщения или «отправлять», когда я хочу, чтобы пользователь был ограничен, только для поиска названий.

Так что я думал, что если в моем цикле foreach я делаю «item» в «item [1]». Это заставит мой код искать только «log [1]». Я не понял, что, поскольку запись «item [1]» является недопустимым синтаксисом.

Текущая функция поиска:

string key; 
Console.Write("\n\tSearch: "); 
key = Console.ReadLine(); 

//Searching through all log[] in loggbok. 
//I want to change this line to item[1] 
foreach (string[] item in loggbok) 
{ 
    //goes deeper and looks for all strings within log[]. 
    foreach (string s in item) 
    { 
     //if a string is found containing key word, this block will run. 
     if (s.Contains(key)) 
     { 
      foundItem = true; 
      Console.WriteLine(String.Join("\r\n", item)); 

      index++; 
     } 
    } 
} 
+0

Хорошо, как насчет этого? – Gobban

+0

Я не хотел писать стену с текстом, но так как я amature программист, я не знаю правильных слов, чтобы упростить этот вопрос. Маби это обширно, и если так, я извиняюсь. Однако я надеюсь, что это облегчит понимание моей проблемы. – Gobban

+0

Я также попытался изменить название, чтобы быть более подходящим. Я не знаю, что я называю «log [1]» в C#. Это элемент, массив, arraymember? я не знаю. Я могу редактировать это, когда знаю, что он называется. – Gobban

ответ

0

Вероятно, вы можете сделать это следующим образом:

var result = loggbok.FirstOrDefault(x=> x.Any(s=> s.Contains(key)); 

Console.WriteLine(result?? "No record found"); 
+0

Могу ли я сделать это аналогично моему коду? Я новичок в программировании, и я запутался, когда я вышел за пределы своей базы знаний. – Gobban

+0

@Gobban в порядке попробуйте это и в своем коммутаторе вместо петель и посмотрите результат. Вам нужен System.Linq – mybirthname

0

Вам даже не нужно петли, так что вам нужно сделать, это извлечь элемент из loggbok по индексу.

// assign loggbokx of index 1, to variable item. 
string[] item = loggbok[1]; 
// item will then have the 2nd (index=1) logbook. 
// Note that index starts from 0. 
// If you want to have the first one, then it should be loggbox[0] 
// to make it even simpler you can write 
//  var item = loggbok[1]; 

// and the rest is the same... 

//goes deeper and looks for all strings within log[]. 
foreach (string s in item) 
{ 
    //if a string is found containing key word, this block will run. 
    if (s.Contains(key)) 
    { 
     foundItem = true; 
     Console.WriteLine(String.Join("\r\n", item)); 

     index++; 
    } 
} 
+0

Я пробовал это, но он только дает мне строку в индексе [x], иначе это звучало бы хорошо. Простой и код я узнаю. То, что мне нужно было, чтобы закодировать массив так, чтобы оператор if мог получить доступ к строкам в журнале [1] – Gobban

+0

в «step into», к которому я пытаюсь получить доступ, называется «new System.Collections.Generic.Mscorlib_CollectionDebugView (loggbok) .Items [0] [1]» – Gobban

0

Давайте сделаем это правильно!

Создать класс модели для журнала:

class LogEntry 
{ 
    public DateTime Date { get; set; } 
    public string Title { get; set; } 
    public string Post { get; set; } 

    public override string ToString() 
    { 
     return "Date: " + Date.ToLongDateString() + " Kl: " + Date.ToShortTimeString() 
      + "\tTitle: " + Title + "\tPost: " + Post; 
    } 
} 

Теперь мы можем удобно использовать эту модель.

Давайте заполнить список с большим количеством записей:

List<LogEntry> loggbok = new List<LogEntry>(); 

for (int i = 0; i < 5; i++) 
{ 
    LogEntry entry = new LogEntry(); 
    entry.Date = DateTime.Now; 
    entry.Title = "title" + i; 
    entry.Post = "post" + i; 

    loggbok.Add(entry); 
} 

Давайте печатать:

foreach (var entry in loggbok) 
    Console.WriteLine(entry); 

Благодаря выходной перегрузки ToString метод смотрит хорошо.

Давайте найдем что-то:

string key = "title3"; 
var found = loggbok.Find(log => log.Title == key); 
Console.WriteLine("Found:\n" + found); 

Мы можем использовать различные methods из List класса и LINQ методы расширения.


Если вам нужно сохранить данные в файле, а затем прочитать их оттуда, вы можете использовать сериализацию json.

Например, давайте использовать JavaScriptSerializer (не забудьте добавить ссылку на сборку):

JavaScriptSerializer jss = new JavaScriptSerializer(); 

// Save 
File.WriteAllText("test.txt", jss.Serialize(loggbok)); 

// Load 
loggbok = jss.Deserialize<List<LogEntry>>(File.ReadAllText("test.txt")); 
0

Это решение, если кто-то считает, что intressting.

foreach (string[] item in loggbok) 
{ 
    foreach (string s in item) 
    { 
     //This was the magic line. 
     string searchTitle = item[1].ToLower(); 

     if (searchTitle.Contains(titleKey.ToLower())) 
     { 
     Console.WriteLine("\n\tSearch hit #" + index); 

     foundItem = true; 

     Console.WriteLine(String.Join("\r\n", item)); 

     index++; 

     break; 
     } 
    } 
}