Как искать строку в классе в С#

Я разрабатываю приложение, в котором у меня есть некоторые данные, извлеченные из сети в класс. Класс

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

Сделайте что-нибудь подобное?

Очевидно, что вы не сможете сопоставить КАЖДОЕ одно слово, но это может стоить выстрела?

Или вы можете попробовать включить теги в каждом поле, а не просто слова. Поэтому вместо того, чтобы помещать "Я окончил университет", у вас есть поле "Образование", а затем суб-поле университета, где они помещают имя.

Все о предельных ошибках, имея в виду, что люди могут делать миллионы ошибок, которые вы просто НЕ МОЖЕТЕ обрабатывать программно.