0

我有一个预定义的列表单词列表。假设它有 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 不起作用。

4

3 回答 3

0

您可以尝试在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();
于 2019-04-22T12:11:38.503 回答
0

尝试以下不需要 Regex :

            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();
于 2019-04-22T12:24:01.760 回答
0

您需要先用+符号分割您的搜索模式,然后您可以轻松找出列表中包含您的搜索模式的那些项目,

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";    

输出:(来自调试器)

在此处输入图像描述

于 2019-04-22T12:48:43.023 回答