2013-07-30 158 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)); 

首先拆分串並轉換爲鍵值對。然後將這些字典壓平成一個字典。然後分組和總和。