2013-06-04 2 views
2

В двух словах ...Объединение двух списков на основе условий, отличных от равняется

У меня есть список папок, управлений версий, которые собраны из ревизий, используя API TFS в структуре:

$/ProjectFolder/BranchName/Проект A

$/ProjectFolder/BranchName/подпапок/Проект B

$/ProjectFolder/BranchName/Проект C

выше будет только выбрать несколько проектов, включенных, то у меня есть список имен всех проектов в формате:

Проект A

Проект B

проекта C

Проект D

Я пытаюсь выбрать новый список, который имеет соединение между двумя списками, а затем получить анонимный тип, который содержит 1-ю структуру, и вторую структуру. Я думаю, что я должен использовать что-то вроде 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

Теперь ясно, но я не ваш спутник. Вы получаете +1 за усилие, хотя :) – Dialecticus

ответ

1

Вы, вероятно, хотите что-то вроде этого:

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

Эти проекты каждый источник папок в экземпляр анонимного типа с Project и Folder свойствами; последняя является исходной папкой, а первая - названием проекта (может быть null, если projectNames не соответствует определенной папке).

Результат затем фильтруется для исключения объектов, которые соответствуют папкам, которые не могут быть связаны с проектом.

Существует также Tuple Приведено эквивалент

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