2016-03-03 86 views
1
private static List<Patient> GetPatientData() 
{ 
    return new List<Patient>() 
    { 
     new Patient(1,new List<Case>() { new Case(10, CaseType.ambulant)}), 
     new Patient(2,new List<Case>() { new Case(20, CaseType.ambulant), new Case(21, CaseType.ambulant), new Case(22, CaseType.stationaer),new Case(23, CaseType.teilstat) }), 
     new Patient(3,new List<Case>() { new Case(30, CaseType.ambulant), new Case(31, CaseType.ambulant), new Case(32, CaseType.stationaer), new Case(33, CaseType.stationaer), new Case(34, CaseType.teilstat) }), 
     new Patient(4,new List<Case>() { new Case(40, CaseType.ambulant), new Case(41, CaseType.stationaer), new Case(43, CaseType.teilstat), new Case(44, CaseType.ambulant), new Case(45, CaseType.stationaer), new Case(46, CaseType.teilstat) }), 
     new Patient(5,new List<Case>() {new Case(53, CaseType.teilstat),new Case(54, CaseType.teilstat) }) 
    };         
} 

List<Patient> patientList = GetPatientData(); 
var result = patientList.SelectMany(item => item.CaseList.Select(itemCase=> itemCase.CaseType).Distinct());    
foreach (CaseType item in result) 
{ 
    Console.WriteLine("CaseTypes = {0}",item);     
} 

上面的代碼給出了Patient的列表,我想要一個不同的案例列表。那麼有沒有什麼優化的方法可以做到這一點?有沒有任何有效的方法來優化以下Linq

Dictionary<int, int> result = patientList.ToDictionary(item => item.PatientID , item=> item.CaseList.Select(x=>x.CaseType).Distinct().Count());    
    foreach (KeyValuePair<int,int> item in result) 
    { 
     Console.WriteLine("{0} {1}", item.Key,item.Value); 
    } 

在第二種情況我想獲得patientID &鮮明CaseType計數爲特定的患者。我可以優化這一個嗎?

+4

否,這對我來說看起來很好。你有一個實際的表現*問題*嗎? –

+1

你爲什麼認爲這段代碼需要優化?它運行緩慢嗎?您是否使用過分析工具來對此進行變更? – HimBromBeere

+0

第一個號碼是唯一的ID號碼嗎?您可以按ID分組,然後從每個組中選擇FirstOrDefault。 Patients.GroupBy(x => x.ID).Select(y => y.FirstOrDefault).ToList(); – jdweng

回答

1

爲了讓不同類型的情況下,所有患者在該列表中,我用

var result = 
    (
    from patient in patientList 
    from typ in patient.CaseList 
    select typ.CaseType 
    ).Distinct(); 

foreach (var item in result) 
{ 
    Console.WriteLine("CaseTypes = {0}", item); 
} 

當然,你可以把它改寫法風格。

要獲得相同不同情況下的清單,但每個患者,嘗試:

var result = 
    (
    from patient in patientList 
    group patient by patient.PatientID into g 
    from patient in g 
    from typ in patient.CaseList 
    select new { ID = g.Key, Type = typ.CaseType } 
    ).Distinct(); 

foreach (var item in result) 
{ 
    Console.WriteLine("Patient {0} has the following case: {1}", item.ID, item.Type); 
} 

另一種(以下重複)來呈現的結果的方法是基團:

var result = 
    (
     from patient in patientList 
     group patient by patient.PatientID into g 
     from p in g 
     select new { g.Key, List = p.CaseList.Select(c => c.CaseType).Distinct() } 
    ).ToDictionary(kv => kv.Key, kv => kv.List); 

foreach (var item in result) 
{ 
    Console.WriteLine("Patient {0} has the following cases:", item.Key); 
    foreach (var type in item.Value) 
    { 
     Console.WriteLine("\t{0}", type); 
    } 
} 
1

你缺少一個最後鮮明:

var result = patientList.SelectMany(item => item.CaseList.Select(itemCase => itemCase.CaseType).Distinct()).Distinct(); 

沒有什麼改善那裏。

你可以選擇只保留最後一個Distinct(所以有一個少的Enumerator被創建),但讓它給你的最終Distinct減少結果。然後,性能會根據數據量(每位患者的患者和病例數量)而改變,儘管沒有任何區別。

+0

http://stackoverflow.com/users/1977143/bruno-garcia感謝評論,但你建議的watever正在對我的數據進行更多的過濾,我不想這樣做。 –

+1

從您的問題看來,您希望所有患者都有明確的病例清單。你列舉你的例子的方式,你會在沒有患者背景的情況下對同一病例的多個結果。對我沒有多大意義。 –

相關問題