是否有任何有效的方法来优化Linq

时间:2016-03-03 11:21:29

标签: c# performance linq

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的列表,我想要一个不同的案例列表。那么有什么优化方法可以做到这一点吗?

    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);
    }

在第二种情况下,我正在努力获得患者ID&amp;针对该特定患者的不同CaseType Count。我可以优化这个。

2 个答案:

答案 0 :(得分:1)

你错过了最后一个区别:

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

那里没什么可改进的。

你可以选择只保留最后一个Distinct(这样就可以创建一个较少的Enumerator)但是让它可以减少你最终Distinct的结果。然后,性能将根据数据量(每位患者的患者和病例数)而改变,但不会产生任何差异。

答案 1 :(得分: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);
    }
}