2

简而言之...

我有一个源代码管理文件夹列表,这些文件夹是使用 TFS API 从变更集中收集的,其结构如下:

$/ProjectFolder/BranchName/项目 A

$/ProjectFolder/BranchName/子文件夹/Project B

$/项目文件夹/分支名称/项目 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" };
4

2 回答 2

2

或者你可以这样做:

var filteredProjects = from source in sourceFolders
                       let project = projectNames.FirstOrDefault(p => source.Contains(p))
                       where project != null
                       select new {
                           SourceFolder = source,
                           Project = project
                       };
于 2013-06-04T10:41:21.423 回答
1

你可能想要这样的东西:

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

这会将每个源文件夹投影到具有ProjectFolder属性的匿名类型的实例中;后者是源文件夹,前者是项目的名称(null如果projectNames与特定文件夹不匹配,则可能是)。

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

还有Tuple-powered 等价物

var filteredProjects = sourceFolders
    .Select(sf => Tuple.Create(
        sf, projectNames.FirstOrDefault(x => sf.Contains(x))
    ))
    .Where(t => t.Item2 != null);
于 2013-06-04T10:37:22.140 回答