代码之家  ›  专栏  ›  技术社区  ›  Nick DeVore

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

  •  2
  • Nick DeVore  · 技术社区  · 15 年前

    我有两个数组,我想在其中查找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
    

    …我只想得到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 见下面马克的评论。我的问题的答案是我。我的locs集合中有一条记录的cds值为零,因此与xml集合中的所有记录匹配。如果我能找到一种没有我自己的编码方式,那么我将是一个完美的开发人员!

    2 回复  |  直到 15 年前
        1
  •  3
  •   Mark Byers    15 年前

    你不见了 Any :

    string[] result = paths.Where(x => tests.Any(y => x.Contains(y))).ToArray();
    
        2
  •  1
  •   Pharabus    15 年前

    你也可以加入他们

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