基于非相等的条件连接两个列表
本文关键字:两个 列表 连接 于非相 条件 | 更新日期: 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);
将每个源文件夹投影到具有Project
和Folder
属性的匿名类型实例中;后者是源文件夹,前者是项目的名称(如果projectNames
没有匹配特定文件夹,则可以是null
)。
然后对结果进行过滤,以消除与不能与项目关联的文件夹对应的对象。
也有Tuple
供电的等效
var filteredProjects = sourceFolders
.Select(sf => Tuple.Create(
sf, projectNames.FirstOrDefault(x => sf.Contains(x))
))
.Where(t => t.Item2 != null);