2016-03-03 3 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);     
} 

Приведенный выше код дает список пациентов, из которого я хочу отдельный список случаев. Итак, есть ли оптимизированный способ сделать это из того, что я сделал?Есть ли эффективный способ оптимизации после 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 & Distinct CaseType графа для этого конкретного пациента. я могу оптимизировать это.

+4

Нет , это выглядит хорошо для меня. У вас есть фактическая производительность * вопрос * с ним? –

+1

Почему, по вашему мнению, этот код нуждается в оптимизации? Он работает медленно? Используете ли вы инструмент профилирования для его изменения? – HimBromBeere

+0

Является ли первое число уникальным идентификационным номером? Вы можете группировать по ID, а затем перенести FirstOrDefault из каждой группы. Patients.GroupBy (x => x.ID). Выберите (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

У вас не хватает последней Distinct:

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

Там нет ничего, чтобы улучшить там.

Вы можете сохранить только последний отличительный признак (так что для него нужно создать меньше счетчика), но при этом вы получите меньше результатов, отданных вашему окончательному отличительному значению. Тогда производительность изменится в зависимости от объема данных (количество пациентов и случаев на одного пациента), хотя ничего не изменит.

+0

http://stackoverflow.com/users/1977143/bruno-garcia спасибо за комментарий, но все, что вы предлагаете, больше фильтрует мои данные, которые я не хочу делать. –

+1

Кажется, из вашего вопроса вы хотели иметь четкий список случаев у всех пациентов. То, как вы перечисляете на своем примере, вы получите несколько результатов для одного и того же случая без контекста пациента. Не имело для меня никакого смысла. –

Смежные вопросы