Фильтрация списка с помощью Find All с оператором OR - PullRequest
0 голосов
/ 26 февраля 2019
if (product_search.Text.Trim() != "")
{
    filteredProductsList = filteredProductsList
      .FindAll(s => s.product.Contains(product_search.Text.Trim().ToUpper()));
}

У меня есть код выше, который фильтрует список продуктов, если продукт содержит искомый текст.Однако я хочу, чтобы это текстовое поле фильтровалось либо на Product, либо на Barcode.Если есть способ запустить FindAll(), но с оператором OR.Итак, отфильтруйте, если продукт содержит искомый текст или штрих-код?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я не уверен, к какому типу списка относится этот фильтрованный список продуктов, но я собираюсь предположить, что это список строк, поэтому, используя linq, вы можете сделать что-то вроде

filteredProductsList = filteredProductsList.Where(x => x.product.Contains(toFind) || x.barcode.Contains(toFind)).ToList();

, если хотите простопротивоположный выбор вы можете просто сделать

filteredProductsList = filteredProductsList.Where(x => !(x.product.Contains(toFind) || x.barcode.Contains(toFind))).ToList();
0 голосов
/ 26 февраля 2019

Примерно так:

// Search if product_search is not all whitespace string
if (!string.IsNullOrWhiteSpace(product_search.Text)) {
  // let's extract a local  variable (readability) 
  string toFind = product_search.Text.Trim();

  // it seems you want case insensetive search: let's specify it clearly:
  // StringComparison.CurrentCultureIgnoreCase
  // trick: IndexOf(..., StringComparison.CurrentCultureIgnoreCase) >= 0 since
  //        we don't have appropriate Contains
  // Finally, you want || - either product or barCode should contain toFind
  filteredProductsList = filteredProductsList
    .FindAll(item => 
       item.product.IndexOf(toFind, StringComparison.CurrentCultureIgnoreCase) >= 0 ||
       item.barCode.IndexOf(toFind, StringComparison.CurrentCultureIgnoreCase) >= 0);
}
...