поиск по ключевому слову linq содержит - PullRequest
3 голосов
/ 11 марта 2011

Хорошо, ребята, это не имеет смысла ...

У меня есть этот метод:

// break down the search terms in to individual keywords
string[] searchTerms = ui_txtSearch.Text.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
// get the complete list of companies
List<Company> results = Company.List();
// foreach keyword
for (int i = 0; i < searchTerms.Length; i++)
{
    // results = the existing result set - the items that dont meet the current search term results.
    results = (from comp in results
           where comp.Name.Contains(searchTerms[i]
           select comp).ToList();
}

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

Моя проблема заключается в том, что это «Содержит» (выделено выше в **) ... если я произнес «Компания» в строке «Имя» и ищу «Со», я ожидаю, что в результате это произойдет, потому что имя будет содержать это, но это не ...

есть идеи?

EDIT:

Хорошо, я обнаружил, что проблема заключалась в чувствительности к регистру, поэтому я изменил код на следующий:

// break down the search terms in to individual keywords
string[] searchTerms = ui_txtSearch.Text.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
// get the complete list of companies
List<Company> results = Company.List();
// foreach keyword
for (int i = 0; i < searchTerms.Length; i++)
{
    // results = the existing result set - the items that dont meet the current search term results.
    results = (
        from comp in results
        where comp.Name.ToLower().IndexOf(searchTerms[i].ToLower()) > -1
        select comp
        ).ToList();
}

Чтобы ответить на некоторые ваши отзывы ниже:

Поисковый термин может быть чем-то вроде «Тестовая компания 1», я ищу все результаты, в которых «test», «company» и «1» можно найти в названии компании, а набор результатов должен содержать все ключевые слова поиска. отображается, когда полное условие поиска разделено на "".

самый чистый способ сделать это с помощью цикла, как я понимаю ??? ... или я не прав?

так что я в основном читаю это как ...

  1. получить список всех компаний
  2. фильтр список по критерию поиска 1
  3. из фильтра отфильтрованного списка по поисковому запросу N ... и повторять, пока не будут учтены все условия.
  4. набор результатов теперь будет содержать все условия поиска, указанные в названии компании.

Текущий код работает и вроде как отвечает на мой вопрос ... но вы думаете, ребята, есть более эффективный способ сделать это?

Спасибо за помощь всем:)

РЕДАКТИРОВАТЬ 2:

Благодаря всей приведенной ниже помощи, я считаю, что окончательная версия (все еще тестируемая) должна быть такой:

// break down the search terms in to individual keywords
string[] searchTerms = ui_txtSearch.Text.ToLower().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
// get the complete list of companies
List<Company> results;
// results = the existing result set - the items that dont meet the current search term results.
results = (
    from comp in Company.List()
    where searchTerms.All(s => comp.Name.ToLower().IndexOf(s) > -1)
    select comp
    ).ToList();

спасибо всем:)

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

Вы переназначаете results на каждой итерации. Но мне также кажется, что вы можете просто заменить весь код следующим:

string[] searchTerms = ui_txtSearch.Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

var results = (from comp in Company.List()
              where searchTerms.All(s => comp.Contains(s))
              select comp).ToList();

Это должно быть немного больше в соответствии с тем, что вы ищете.

1 голос
/ 11 марта 2011

«Результаты» переназначается на каждой итерации, поэтому результаты будут только результатами последнего поискового термина в массиве. Вам также не хватает закрывающей скобки для метода «Содержит». Я бы сказал, что вам, вероятно, придется сделать что-то вроде:

  1. Используйте другую переменную списка для хранения результатов (например, "finalResults") и запрашивайте только исходный список.

  2. Добавить в построенный список: finalResults.AddRange ((запрос linq) .ToList ());

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

1 голос
/ 11 марта 2011

Код в цикле присваивает конечный результат results, который также является искомыми данными. Поэтому, если значение Co является вторым элементом в searchTerms, оно, скорее всего, не найдет его, поскольку оно было бы очищено на первой итерации.

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