2013-10-17 53 views
2

我的情况是这样的: 我有一个TFS变更集的列表。 每个更改集都有一个ID和相关工作项目的列表。 一个工作项目有一个ID和一个链接列表,这些链接基本上是带有更改集ID的字符串。在LINQ中翻转分组

我想要一个具有反向层次结构的列表,意思是我想要一个工作项目列表,并为每一个列出相关的变更集(并保留两者的ID字段)。

的现在结构:

---chageset1 
     | 
     |-------workitem1 
     |-------workitem2 
---chageset2 
     | 
     |-------workitem2 
     |-------workitem3 

我想要的结构

---workitem1 
     | 
     |-------chageset1 
---workitem2 
     | 
     |-------chageset1 
     |-------chageset2 
---workitem3 
     | 
     |-------chageset2 
+0

而不是你的语法为您的结构,我建议用制表符嵌套它们。在第一行上,有ChangeSet1,在第二行上,添加4个空格,并将WorkItem1放在第三行,4个空格和WorkItem2上,这样WorkItem1和WorkItem2可以直线上下。下一行ChangeSet2将一直回到左侧。这会更容易理解。 – seekerOfKnowledge

+0

哦,刚刚看到乍得的编辑。谢谢乍得。 – seekerOfKnowledge

+1

发布可用数据结构的声明(类型)。 –

回答

2

你可以使用LINQ来做到这一点....

changesets.SelectMany(x => x.workitems.Select(y => new { 
                 changeset = x.id, 
                 workitem=y.id}) 
      .GroupBy(x => x.workitem) 
      .Select(x => new { 
           workitem = x.Key, 
           Changesets = x.Select(y = > y.changeset).ToArray() 
          }).ToArray(); 
2
WorkItem w1 = new WorkItem { Name = "w1" }; 
WorkItem w2 = new WorkItem { Name = "w2" }; 
WorkItem w3 = new WorkItem { Name = "w3" }; 
ChangeSet c1 = new ChangeSet { Name = "c1", WorkItems = new List<WorkItem> { w1 } }; 
ChangeSet c2 = new ChangeSet { Name = "c2", WorkItems = new List<WorkItem> { w3, w2 } }; 
ChangeSet c3 = new ChangeSet { Name = "c3", WorkItems = new List<WorkItem> { w3 } }; 
List<ChangeSet> changeSets = new List<ChangeSet> { c1, c2, c3 }; 
var result = changeSets 
    .SelectMany(c => c.WorkItems) 
    .Distinct() 
    .ToDictionary(w => w, 
        w => changeSets.Where(c => c.WorkItems.Contains(w))); 
foreach (var kvp in result) 
{ 
    var workItem = kvp.Key; 
    var changeSetsForWi = kvp.Value; 
    Console.WriteLine(workItem.Name); 
    foreach (var cs in changeSetsForWi) 
    { 
     Console.WriteLine(" " + cs.Name); 
    } 
} 
0
public class ChangeSet 
{ 
    IList<WorkItem> WorkItems {get;set;}; 
} 

public class WorkItem 
{ 
    IList<ChangeSet> ChangeSets{get;set;}; 
} 

这样做很容易,迭代你的变更集或工作项并打印出他们的内容。

foreach(var workitem in workItems) 
{ 
    WriteOut(workItem); 
    WriteOut(workItem.ChangeSets); 
} 
+0

你在鼓励不必要的信息重复。此外:你怎么可能协调一个ChangeSet,它说包含WorkItem并没有说它属于那个ChangeSet? –

+0

速度vs存储。还有几个参考字节,但它会比使用selectmany和select组更快。当然,你必须正确填写它们,否则将无法正常工作。我认为这是一个逻辑上一致的域模型。变更集包含工作项目,工作项目具有变更集,因此很简单。 – Carra