2010-03-01 153 views
2

我有两个数组,我想查找Array0中的所有元素,其中Array1的完整字符串包含在Array0的字符串中。这里是场景:基于字符串比较的数组交集基于字符串比较

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

所以,我的阵列0具有类似:

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

我的数组1具有:

6011044 
6028833 

...我只希望有从阵列0的结果,其中的文件路径字符串包含字符串来自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集合中的所有记录。如果我能找到一种自己编码的方式,那么我就是最完美的开发者!

回答

3

你错过Any

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

我觉得你是对的,但我不能让它为我工作。帮助我更多;) –

+1

最佳猜测:你的l.CdsCode.ToString()之一是空字符串。这将匹配所有文件。 –

+0

GENIUS!我在我的locs集合中有一个记录为零。而且,我所有的CDS代码都包含一个零,所以他们都回来了。很棒的猜测! –

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