Линейный поиск в массиве списков

#c# #arrays

Вопрос:

работая над проектом, в котором я создаю «блог», который помещает записи в блог в массив строк, который затем переносится в массив списков. Это мой текущий код, и я был бы признателен за любую помощь. Я все еще новичок в c# и программировании в целом, поэтому не знаю, как это исправить.

Текущая проблема заключается в том, что в случае 3 я получаю сообщение об ошибке : оператор «= = » не может быть применен к операндам типа «строка» и » строка []», а имя » i «не существует в текущем контексте кодового блока «сообщение в блоге».

Я создал здесь минимальный воспроизводимый пример, и единственные другие функции, которые в противном случае есть у программы, — это 1. Удалите все посты в блоге и 2. распечатайте все посты в блоге с их названием и содержанием.

 bool minBool = true;  Listlt;string[]gt; blogPost = new Listlt;string[]gt; { };  string[] post = new string[2];   while (minBool)  {  Console.WriteLine("nntWelcome to the blog!");  Console.WriteLine("nt[1] - Write a blogpost");  Console.WriteLine("t[3] - Search for a blogpost");  Console.Write("ntChoice:");  Int32.TryParse(Console.ReadLine(), out int input);   switch (input)  {  case 1:  Console.Write("tName your post: ");  post = new string[2];  post[0] = Console.ReadLine();  Console.Write("tWrite your post: ");  post[1] = Console.ReadLine();  blogPost.Add(post);   break;   case 3:   string searchTerm = Console.ReadLine();  string result = "The blogpost doesn't exist";  foreach (string blog in blogPost)  {  if (searchTerm == blog)  {  result = $"tThe post is in the blog: {post[i]}";  break;  }  }  Console.WriteLine(result);  break;  

Ответ №1:

Проблема в том, что вы пытаетесь сравнить searchterm переменную , которая является a string , с элементом blogpost переменной, который имеет тип string[] . Это не сработает.
Вместо этого вы можете сделать что-то вроде этого:

 foreach(var blog in blogPost) {  if(searchTerm == blog[0] || searchTerm == blog[1])  {  result = $"tThe post is in the blog: {blog[0]}"; // Print blog name  break;  } }  

Но таким образом, ваш поисковый запрос должен точно совпадать с названием или содержанием поста. Что не очень удобно для быстрого поиска. Вместо точного сравнения строки вы можете использовать Contains() метод:

 if(blog[0].Contains(searchTerm) || blog[1].Contains(searchTerm)) {  result = $"tThe post is in the blog: {blog[0]}"; // Print blog name  break; }  

Теперь вы можете искать сообщения в блоге, указывая только часть имени или содержимого.
Имейте в виду, что на консоль будет выведена только первая запись в блоге, соответствующая поисковому запросу.

Подумайте о создании BlogPost класса для сохранения записи в блоге внутри a List . Таким образом, ваш код будет более выразительным и простым в обработке:

 public class BlogPost {  public string Name { get; }  public string Content { get; }   public BlogPost(string name, string content)  {  Name = name;  Content = content;  } }  

Тогда сохраните его вот так:

 private Listlt;BlogPostgt; _blogPosts = new Listlt;BlogPostgt;();  [...]  case 1:  Console.Write("tName your post: ");  var name = Console.ReadLine();  Console.Write("tWrite your post: ");  var content = Console.ReadLine();    _blogPosts.Add(new BlogPost(name, content));  

Теперь ваш поиск выглядит примерно так:

 foreach (var blog in _blogPosts) {  if(blog.Name.Contains(searchTerm) || blog.Content.Contains(searchTerm))  {  result = $"tThe post is in the blog: {blog.Name}"; // Print blog name  break;  } }  

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

Комментарии:

1. Спасибо, но я вообще не должен использовать Linq / создавать класс в этом проекте, я, вероятно, должен был включить это. Моя вина. Однако с первым блоком кода, который вы опубликовали, я все еще получаю сообщение об ошибке «не удается преобразовать тип «строка[]» в строку». И разве этот метод не будет выполнять поиск только по самым последним публикациям, а не по всем публикациям в списке?

2. Я отредактировал свой ответ, чтобы настроить цикл foreach. Проблема в том, что блог имеет тип string[] и нет string . Чтобы исправить это, используйте либо var (как в моем ответе), либо string[] для типа blog . Этот метод выполнит поиск по всему blogPost списку и прервется, как только одно из сообщений в блоге совпадет с поисковым запросом.

3. Теперь это работает, большое спасибо, чувак. Я действительно ценю это 🙂