【问题标题】:Compare two lists from user比较来自用户的两个列表
【发布时间】:2019-09-11 15:00:37
【问题描述】:

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

【问题讨论】:

  • 我编辑了您的问题并添加了新信息。请记住始终包含所有相关信息into the question itself
  • 你的变量“searchword”会是正则表达式吗?
  • searchword+后面的空格(不应该是searchwords吗?)可以忽略吗?为什么输出没有asxy?为什么输出有一个空字符串?
  • 感谢大家提供宝贵的 cmets 和解决方案

标签: c# regex string linq


【解决方案1】:

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

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

输出:(来自调试器)

【讨论】:

    【解决方案2】:

    尝试以下不需要正则表达式:

                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();
    

    【讨论】:

      【解决方案3】:

      您可以尝试借助 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 2020-02-02
        • 2011-06-19
        • 1970-01-01
        • 2015-04-06
        相关资源
        最近更新 更多