2013-07-30 107 views
1

我有一个对象,而对象的其中一个属性是用逗号分隔的名称列表,例如LINQ按结果分割并分组

IList<Audits> auditData = new List<Audits>(); 
auditData.Add(new Audit 
       { 
        Auditors = "Adam West, George Best", 
        TimeSpent = 7 
       }); 

auditData.Add(new Audit 
       { 
        Auditors = "Adam West", 
        TimeSpent = 5 
       }); 

auditData.Add(new Audit 
       { 
        Auditors = "Adam West, George Best, Elvis Presley", 
        TimeSpent = 3 
       }); 

我想使用LINQ查询这个数据,分割财产审计,按审计师和总的timespent每个审核员,给我审核人员名单一起度过针对每一个例如时间

亚当西15,
乔治·贝斯特10,
猫王3

谁能帮助我这样做?谢谢。

+1

到目前为止您尝试过什么?是否有任何理由为什么'审计员'不能成为'名单'开始? –

+0

我第二次与JonSkeet合作,如果您使用的是名单类型的审核员,解决方案更容易。 (它支持IEn) – KarelG

+0

我也想把它作为一个列表开始 - 不幸的是,这是现有系统的一部分,我无法控制该属性被逗号分隔。 – Matt

回答

1

这应该做你想要什么:

var query = 
    from a in auditData 
    let auditors = a.Auditors.Split(',').Select(s => s.Trim()) 
    from au in auditors 
    group a.TimeSpent by au into g 
    select new { Auditor = g.Key, TimeSpent = g.Sum() }; 
+0

谢谢 - 作品一种享受。 – Matt

2

使用lambda表达式:

var results = 
    auditData 
     // Flatten list - to list of individual auditors and time spent 
     .SelectMany(
      audit => audit.Auditors.Split(',').Select(s => s.Trim()), 
      (audit, auditorName) => new 
      { 
       Auditor = auditorName, 
       TimeSpent = audit.TimeSpent, 
      }) 
     // Group by auditor name 
     .GroupBy(a => a.Auditor) 
     // Sum time spent 
     .Select(auditorGroup => new 
     { 
      Auditor = auditorGroup.Key, 
      TotalTimeSpent = auditorGroup.Sum(a => a.TimeSpent) 
     }) 
     .ToList(); 
1
var res = auditData.Select(audit => audit.Auditors.Split(',').ToDictionary(a => a, a => audit.TimeSpent)) 
      .SelectMany(a => a) 
      .GroupBy(a => a.Key) 
      .ToDictionary(g => g.Key, s => s.Sum(g => g.Value)); 

首先拆分串并转换为键值对。然后将这些字典压平成一个字典。然后分组和总和。