2016-03-03 87 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

从您的问题看来,您希望所有患者都有明确的病例清单。你列举你的例子的方式,你会在没有患者背景的情况下对同一病例的多个结果。对我没有多大意义。 –

相关问题