基于字符串比较的数组交集

时间:2010-03-01 23:21:19

标签: linq arrays

我有两个数组,我想找到Array0中的所有元素,其中Array1的完整字符串包含在Array0的字符串中。这是场景:

我有一个字符串数组,其中包含某个目录中所有xml文件的完整路径。然后我得到一个位置列表,只想返回xml文件的子集,其中xml文件的文件名是loc id。

所以,我的Array0有类似的东西:

c:\some\directory\6011044.xml
c:\some\directory\6028393.xml
c:\some\directory\6039938.xml
c:\some\directory\6028833.xml

我的Array1有:

6011044
6028833

...我只希望得到Array0的结果,其中filepath字符串包含Array1的字符串。

这就是我所拥有的......

 filesToLoad = (from f in Directory.GetFiles(Server.MapPath("App_Data"), "*.xml")
   where f.Contains(from l in locs select l.CdsCode.ToString()) 
   select f).ToArray();

...但我收到以下编译错误......

Argument '1': cannot convert from 'System.Collections.Generic.IEnumerable<string>' to 'string'

......从英语的角度来看,我可以理解,但不知道如何解决。

我是从错误的角度来的吗?

我只缺少一件吗?

修改

以下是我将其更改为:

filesToLoad = (Directory.GetFiles(Server.MapPath("App_Data"), "*.xml"))
     .Where(path => locs.Any(l => path.Contains(l.CdsCode.ToString()))
 ).ToArray();

...但是这仍然可以获取所有.xml文件,即使其中一个不在我的locs实体集合中。我放错了什么地方?

显然我缺少主要概念,所以或许对每件作品做些什么也有帮助呢?

编辑2 请参阅下面的Mark的评论。我的问题的答案就是我。我的locs集合中有一条记录,其CDS值为零,因此匹配了我的xml集合中的所有记录。如果我能找到一种没有自己的代码方式,那么我就是完美的开发者!

2 个答案:

答案 0 :(得分:3)

你错过了Any

string[] result = paths.Where(x => tests.Any(y => x.Contains(y))).ToArray();

答案 1 :(得分:1)

你也可以加入他们

       var filesToLoad = (from f in Directory.GetFiles(Server.MapPath("App_Data"), "*.xml")
       from l in locs 
       where f.Contains(l.CdsCode.ToString()) 
       select f).ToArray();