基于非相等的条件连接两个列表

本文关键字:两个 列表 连接 于非相 条件 | 更新日期: 2023-09-27 18:16:46

总之…

我有一个源代码控制文件夹列表,这些文件夹是使用TFS API从更改集收集的,结构如下:

/ProjectFolder/BranchName/项目美元

美元/ProjectFolder BranchName/文件夹/项目B

/ProjectFolder/BranchName/美元项目C

上面将只包含几个项目,然后我有一个所有项目名称的列表,格式为:

项目

项目B

项目C

项目D

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

I have try:

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" };

基于非相等的条件连接两个列表

或者你可以这样做:

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

您可能想要这样的内容:

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

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

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

也有Tuple供电的等效

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