【问题标题】:String Contains Does Not Work In LINQ [closed]字符串包含在 LINQ 中不起作用 [关闭]
【发布时间】:2018-04-18 16:47:49
【问题描述】:

我一直使用 Contains 方法为我的 LINQ 查询获取 SQL IN 功能。

但这一次,发生了很奇怪的事情。

我有一个这样的字符串数组:

string[] FilenamesToParse = {"JOHN_X200-", "DOE_X300-", "FOO_X300_M-"};

然后我像下面这样使用了这个数组:

var result = (from dps in appProcessList
                   where FilenamesToParse.Contains(dps.FileName)
                   select dps.Devices).ToList()

上面的查询结果为 0,但我确定有文件名包含在 FilenamesToParse 数组中定义的单词。

所以我尝试了下面的 sn-p 并且 包含 工作。

foreach (var applicationProcess in appProcessList)
{
   if (applicationProcess.FileName.Contains(FilenamesToParse[0]))
   {

   }
}

我哪里错了? 提前致谢。

【问题讨论】:

  • 我确定有文件名包含在 FilenamesToParse 数组中定义的单词。 我确定不是,但我们如何在不知道数组中的内容的情况下进行测试?
  • dps.FileName 的一些值是什么。了解正在检查哪些数据会有所帮助...
  • 第二次检查与第一次检查相反...
  • 你的两个方法不相似。在您的 linq 中,您正在迭代您的 FilenamesToParse-array 并检查它的任何元素是否完全匹配 dps.FileName,从而在第二个中您迭代 appProcessList 并检查其是否为 FileName -属性包含第一个FilenamesToParse
  • Array.Contains,本质上是您在第一个示例中调用的内容,与 String.Contains(您在第二个示例中调用的内容)不同。

标签: c# linq contains


【解决方案1】:

您的两种方法并不相似。在您的 linq 中,您正在迭代您的 FilenamesToParse-array 并检查它的任何元素是否完全匹配 dps.FileName,从而在第二个中迭代 appProcessList 并检查其是否为 FileName -属性包含第一个FilenamesToParse

以下将是类似于您的循环的 linq 方法:

var result = (from dps in appProcessList
               where FilenamesToParse.Any(x => dps.FileName.Contains(x))
               select dps.Devices).ToList()

【讨论】:

  • 感谢您的方法!在快速查看 LINQ 中包含的定义后,我意识到了这一点。我已经通过在查询后添加额外的 foreach 来完成它,但这是更清晰的方法。
  • 延迟执行 (=>) 是关键,这是一个很好的解释方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多