2013-06-04 28 views
2

简而言之...加入两个列表比等于

我有一个从使用TFS API的变更中的结构云集源控制的文件夹列表:

$/ProjectFolder/BRANCHNAME /项目A

$/ProjectFolder/BRANCHNAME /子文件夹/项目B

$/ProjectFolder/BRANCHNAME /项目C

以上将只包括有选择的几个项目,那我也格式为所有的项目名称的列表:

项目A

项目B

项目C

项目D

我试图选择一个新列表,其中有两个列表之间的连接,然后获取包含第一个结构和第二个结构的匿名类型。我想我应该使用类似Contains的东西,但是当尝试使用连接时,语法只提供equals

我曾尝试:

var sourceFolders = new List<string>() 
{ 
    "$/ProjectFolder/BranchName/Project A", 
    "$/ProjectFolder/BranchName/Sub-Folder/Project B", 
    "$/ProjectFolder/BranchName/Project C" 
}; 
var projectNames = new List<string>() { "Project A", "Project B", "Project C", "Project D"}; 
var filteredProjects = sourceFolders.Where(sourceFolder => projectNames.Any(x => sourceFolder.Contains(x))); 

filteredProjects将只包含sourceFolders然而,而不是其project它已经映射太...

任何想法?

所需的输出

new { SourceFolder = "$/ProjectFolder/BranchName/Project A", ProjectName = "Project A" }; 
new { SourceFolder = "$/ProjectFolder/BranchName/Subfolder/Project B", ProjectName = "Project B" }; 
new { SourceFolder = "$/ProjectFolder/BranchName/Project C", ProjectName = "Project C" }; 
+1

这是我不明白什么是你想要的输出。我假设你在这里写的两个列表是输入。 – Dialecticus

+0

@Dialecticus我假设你投了票,我发布了期望的结果 - 我认为解释很清楚。我希望这已经清理了:) – LukeHennerley

+0

现在很清楚,但我不是你的downvoter。你得到+1的努力,虽然:) – Dialecticus

回答

1

你可能想是这样的:

var filteredProjects = sourceFolders 
    .Select(sf => new { 
     Project = projectNames.FirstOrDefault(x => sf.Contains(x)), 
     Folder = sf 
    }) 
    .Where(o => o.Project != null); 

该项目的每个源文件夹到一个匿名类型与ProjectFolder性能的实例;后者是源文件夹,前者是项目名称(如果projectNames与特定文件夹没有匹配,则可能是null)。

然后对结果进行过滤以消除与无法与项目关联的文件夹对应的对象。

也有Tuple -Powered相当于

var filteredProjects = sourceFolders 
    .Select(sf => Tuple.Create(
     sf, projectNames.FirstOrDefault(x => sf.Contains(x)) 
    )) 
    .Where(t => t.Item2 != null); 
+0

啊我是过于复杂的东西......感谢指出我在正确的方向:) – LukeHennerley

2

或者你也可以做这样的:

var filteredProjects = from source in sourceFolders 
         let project = projectNames.FirstOrDefault(p => source.Contains(p)) 
         where project != null 
         select new { 
          SourceFolder = source, 
          Project = project 
         };