Как сделать поиск из списка с не префиксными ключевыми словами - PullRequest
3 голосов
/ 11 апреля 2010

Я программирую программу для поиска по имени из списка, и мне нужно найти их, даже если ключевое слово находится не перед именами (это то, что я имею в виду без префикса)

например, , если в моем списке есть музыкальные инструменты, и я набираю "гитара" в поле поиска.
Следует найти названия "Гитара, Гитараон, Акустическая гитара, Бас-гитара, ..."
или что-то в этом роде * * * * * * Поисковый запрос Longdo Dictionary.

вот мой простой и глупый алгоритм (это все, что я могу сделать)

    const int SEARCHROWLIMIT = 30;
    private string[] DoSearch(string Input, string[] ListToSearch)
    {
        List<string> FoundNames = new List<string>();

        int max = 0;
        bool over = false;
        for (int k = 0; !over; k++)
        {
            foreach (string item in ListToSearch)
            {
                max = (max > item.Length) ? max : item.Length;
                if (k > item.Length) continue;
                if (k >= max) { over = true; break; }
                if (!Input.Equals("Search")
                    && item.Substring(k, item.Length - k).StartsWith(Input, StringComparison.OrdinalIgnoreCase))
                {
                    bool exist = false;
                    int i = 0;
                    while (!exist && i < FoundNames.Count)
                    {
                        if (item.Equals(FoundNames[i]))
                        {
                            exist = true;
                            break;
                        }
                        i++;
                    }
                    if (!exist && FoundNames.Count < SEARCHROWLIMIT)
                        FoundNames.Add(item);
                    else if (FoundNames.Count >= SEARCHROWLIMIT) over = true;
                }
            }
        }
        return FoundNames.ToArray();
    }

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

И еще одна проблема - мне нужно искать музыкальные инструменты по категориям, таким как струны, ударные, ... и по стране происхождения. Поэтому мне нужно искать их с фильтром по типу и стране.

Как мне этого добиться?

Ответы [ 3 ]

6 голосов
/ 11 апреля 2010

Используя LINQ, вы можете написать код, подобный этому:

var resultSet = products

    // filter products by category
    .Where(product => product.Category == "strings")

    // filter products by origin
    .Where(product => product.Origin == "italy")

    // filter products whose name contains a word starting with "guit"
    .Where(product => (" " + product.Name).Contains(" guit"))

    // limit the result set to the first 30 matching products
    .Take(30);

Если ваши наборы продуктов достаточно малы, вы можете использовать LINQ-to-Objects. В противном случае вам следует использовать базу данных и взглянуть на LINQ-to-SQL.

2 голосов
/ 11 апреля 2010

Одно слово. База данных!

Серьезно, если вы хотите выполнить все эти различные поиски, рассмотрите возможность размещения ваших данных в базе данных со схемой, которая упрощает проблемы классификации, которые у вас возникают. Sql Server Express теперь поддерживает полнотекстовый поиск , что было бы очень полезно для поиска, который вы пытаетесь выполнить.

Есть хороший пост в блоге здесь об использовании FTS с Linq-to-Sql.

0 голосов
/ 11 апреля 2010
static List<string> GetItemsWithWordsStartingWithSubstring(List<string> list, string substring)
{
    var query = from str in list
                from item in str.Split(' ')
                where item.StartsWith(substring, StringComparison.InvariantCultureIgnoreCase)
                select str;

    return query.ToList();
}

Надеюсь, я правильно прочитал ваш начальный вопрос. Эта функция вернет любой элемент из списка, который содержит слово, начинающееся с вашей подстроки. Можно добавить больше знаков препинания к параметрам разделения. Дан список со следующим содержанием:

"abcdef", "defabc", "def abc", "xyz"

Поиск по "abc" найдет "abcdef" и "def abc", но не "defabc".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...