Сравните два списка от пользователя - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть предопределенный список Список слов. Скажем, у него есть 7 элементов:

List<string> resourceList={"xyz","dfgabr","asxy", "abec","def","geh","mnbj"}

Скажем, пользователь вводит "xy + ab", т.е. он хочет искать "xy" или "ab"

string searchword="xy+ ab";

Затем я должен найти все слова в предопределенном списке, которые имеют «xy» или «ab», то есть все слова, разделенные на «+»

Таким образом, вывод будет иметь:

{"xyz","dfgabr","abec",""}

Я пытаюсь что-то вроде:

resourceList.Where(s => s.Name.ToLower().Contains(searchWords.Any().ToString().ToLower())).ToList()

Но я не могу сформировать запрос LINQ, так как есть 2 массива, и один подход, который я видел, был объединить 2 массива итогда попробуй;но поскольку мой второй массив содержит только часть первого массива, мой LINQ не работает.

Ответы [ 3 ]

0 голосов
/ 22 апреля 2019

Попробуйте следующее, для которого не нужно регулярное выражение:

            List<string> resourceList= new List<string>() {"xyz","dfgabr","asxy","abec","def","geh","mnbj"};
            List<string> searchPattern = new List<string>() {"xy","ab"};

            List<string> results = resourceList.Where(r => searchPattern.Any(s => r.Contains(s))).ToList();
0 голосов
/ 22 апреля 2019

Сначала необходимо разделить шаблон поиска знаком +, а затем вы можете легко определить, какие из элементов списка содержат шаблон поиска,

var result = resourceList.Where(x => searchword.Split('+').Any(y => x.Contains(y.Trim()))).ToList();

Где:

Ваш resourceList равен

List<string> resourceList = new List<string> { "xyz", "dfgabr", "asxy", "abec", "def", "geh", "mnbj" };

И шаблон поиска:

string searchword = "xy+ ab";    

Вывод: (из отладчика)

enter image description here

0 голосов
/ 22 апреля 2019

Вы можете попробовать запросить с помощью Linq :

List<string> resourceList = new List<string> {
  "xyz", "dfgabr", "asxy", "abec", "def", "geh", "mnbj"
};

string input = "xy+ ab";

string[] toFind = input
  .Split('+')
  .Select(item => item.Trim()) // we are looking for "ab", not for " ab"
  .ToArray();

// {"xyz", "dfgabr", "asxy", "abec"}
string[] result = resourceList
  .Where(item => toFind
     .Any(find => item.IndexOf(find) >= 0))
  .ToArray();

// Let's have a look at the array
Console.Write(string.Join(", ", result));

Результат:

xyz, dfgabr, asxy, abec

Если вы хотите игнорировать регистр , добавьте параметр StringComparison.OrdinalIgnoreCase к IndexOf

string[] result = resourceList
  .Where(item => toFind
     .Any(find => item.IndexOf(find, StringComparison.OrdinalIgnoreCase) >= 0))
  .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...