Как искать строку в классе в С#
Я разрабатываю приложение, в котором у меня есть некоторые данные, извлеченные из сети в класс.
Класс
public class Detail
{
public string name { get; set; }
public List<Education> education { get; set; }
public City city { get; set; }
public List<Work> work { get; set; }
}
public class Education
{
public string DegreeName { get; set; }
}
public class City
{
public string name { get; set; }
}
public class Work
{
public string name { get; set; }
}
Данные хранятся для человека в вышеуказанном классе.
Теперь я хочу найти строку: q=" Which Manager Graduated From USA ?"
Итак, я хочу, чтобы он выполнил поиск вышеуказанного запроса...
В зависимости от того, сколько слов соответствует, я хочу указать имя пользователя. Итак, ищите человека, если он окончил школу из США? (может быть меньше слов, для поиска, как какой-то директор из Индии)
Подход, который я пытаюсь найти для таких слов, как "Диспетчер" в Work
и "Выпускник" в Education
и "Место для USA
Я создаю массив строки поиска
string[] qList = q.Split(' ');
а затем пройти через класс. Но я не знаю, как (эффективно) искать данные в классе.
И мой подход достаточно хорош для поиска или есть лучший вариант?
Ответы
Ответ 1
То, что вы разрабатываете, - это язык для чтения и записи на языке. Начиная с раскола строки может быть, ну, начните, но представьте себе возможности поиска:
Поиск людей в городе или ряде городов, поиск людей, которые работали в топ-500 компании или в определенной области.
С этой целью вы должны разработать язык запросов. С легкостью и документированной грамматикой. Взгляните на ANTLR Генератор Parser, который хорошо играет с С#/. NET.
Ответ 2
Я как-то беспокоюсь о механизме, который вы пытаетесь реализовать, если пользовательские типы q=" Manager Graduated From USA ?"
, значит, не помещает в него слово "which", поэтому вам придется искать язык запросов, например ANTLR.
Моя рекомендация - предоставить раскрывающимся спискам пользователю, сначала должна содержать значения Work Property, вторая должна содержать значения образования и текстовое поле для входа в Город.
После передачи этих значений в свой метод используйте LINQ для получения данных из вашей коллекции, например:
var filteredResults = from result in YOURDETAILCOLLECTION
where result.city.Contains(YOURCITYTEXTBOXVALUE)
select result;
Вы можете найти механизм, как where
в LINQ
на List
.
Ответ 3
Если это вообще возможно, попробуйте индексировать свои данные с помощью Lucene.NET или аналогичной поисковой технологии, такой как Solr или ElasticSearch. Эти технологии оптимизированы для поиска и предоставляют вам множество возможностей для улучшения ранжирования ваших результатов. Он может легко ответить на вопрос в вашем открытии, и это очень быстро. Было бы очень сложно реализовать эту функциональность самостоятельно.
Ответ 4
Если у вас есть несколько полей, которые вы знаете, как "Образование и работа", я бы рекомендовал иметь для каждого поля массив синонимов и связанных слов.
Итак, для образования у вас может быть список таких слов:
Graduate, University, School, Learning, Taught e.t.c
Сделайте что-нибудь подобное?
Очевидно, что вы не сможете сопоставить КАЖДОЕ одно слово, но это может стоить выстрела?
Или вы можете попробовать включить теги в каждом поле, а не просто слова. Поэтому вместо того, чтобы помещать "Я окончил университет", у вас есть поле "Образование", а затем суб-поле университета, где они помещают имя.
Все о предельных ошибках, имея в виду, что люди могут делать миллионы ошибок, которые вы просто НЕ МОЖЕТЕ обрабатывать программно.