【问题标题】:Return true per item if list1 contains part of any string from list2如果 list1 包含 list2 中任何字符串的一部分,则每项返回 true
【发布时间】:2021-04-13 16:55:56
【问题描述】:

如果 list1 中的字符串(或字符串的一部分)与 list2 中的字符串相同,则需要将字符串添加到列表框中。

我现在有:

            int g = 0;

            while (g < musthaves.Count())
            {
                if (list1.Contains(list2[g].ToString()))
                {
                    listBox14.Items.Add("Found: " + list2[g].ToString());
                }
                else
                {
                    listBox14.Items.Add("Not found: " + list2[g].ToString());
                }
                g++;
            }

名单如下:

列表1:
测试用例扫描文档
测试用例上传文件
测试用例删除文档

列表2:
上传文件
扫描文件
表示不一致


所以列表框应该包含:

找到:上传文件
找到:扫描文档
未找到:表示不一致

但我的结果不是每个字符串都找到。

感谢任何帮助。

【问题讨论】:

    标签: c# if-statement while-loop contains


    【解决方案1】:

    但我的结果不是每个字符串都找到。

    因为List.Contains 检查项目的完全匹配。例如。您正在检查list1 中是否有字符串"upload document",但事实并非如此。

    您需要Enumerable.Any 来检查序列中的任何元素是否符合条件。和String.Contains 检查第二个列表中的字符串是否是来自list1 的字符串的子字符串:

    if (list1.Any(l1 => l1.Contains(list2[g])))
    

    【讨论】:

      【解决方案2】:

      您只检查完整字符串是否是另一个列表中的项目之一,但您的要求是

      如果 list1 中的字符串(或字符串的一部分)与 list2 中的字符串相同

      所以你需要检查list2 中的每个短语,如果短语包含来自list1 的预期短语之一(呃,我建议对变量使用更具描述性的名称 - 将简化对话:))

      foreach (var requiredPhrase in list1)
      {
          if (list2.Any(phrase => phrase.Contains(requiredPhrase))
          {
              // Found
          }
          else
          {
              // Not found
          }
      }
      

      【讨论】:

      • 这也是我会这样做的方式,除了根据问题中的示例列表是错误的方式
      【解决方案3】:

      以下内容应该对您有所帮助。

      list2.Where(x=>list1.Any(c=>c.Contains(x)));
      

      上述查询将遍历list2 中的每个元素并检索那些是list1 中任何项目的子字符串

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 2021-10-22
        • 2020-08-21
        • 2020-11-12
        • 2015-05-02
        • 2021-06-27
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        相关资源
        最近更新 更多