По крайней мере один объект должен реализовывать Icomparable - PullRequest
2 голосов
/ 09 сентября 2011

Я пытаюсь получить уникальные значения в списке схожих значений, отличающихся только одним элементом в строке с разделителем канала ... Я продолжаю получать, по крайней мере, один объект должен реализовывать Icomparable. Я не понимаю, почему я продолжаю получать это. Я могу сгруппировать это значение ... Почему я не могу найти максимум ... Я думаю, он ищет что-то для сравнения. Если я получу целочисленную версию, она перестанет на меня кричать? Это последний раз, когда я собираюсь попробовать использовать LINQ ...

    var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1]).Select(x => x.Max());

Я знаю, что могу получить уникальные значения другим способом. Мне просто трудно понять это. В этом списке я знаю, что строка с самым высоким значением среди аналогичных братьев - это та, которую я хочу добавить в список. Как я могу это сделать? Я полностью рисую пробел, потому что я пытался заставить это работать в linq в течение прошлых нескольких дней без удачи ...

    foreach (XmlNode node in nodeList)
            {
                XmlDocument xDoc = new XmlDocument();
                xDoc.LoadXml(node.OuterXml);
                string popPatInfo = xDoc.SelectSingleNode("./template/elements/element[@name=\"FirstName\"]").Attributes["value"].Value + ", " + xDoc.SelectSingleNode("./template/elements/element[@name=\"LastName\"]").Attributes["value"].Value + " | " + DateTime.Parse(xDoc.SelectSingleNode("./template/elements/element[@name=\"DateOfBirth\"]").Attributes["value"].Value.Split('T')[0]).ToString("dd-MMM-yyyy");
                string patientInfo = xDoc.SelectSingleNode("./template/elements/element[@name=\"PatientId\"]").Attributes["value"].Value + "|" + xDoc.SelectSingleNode("./template/elements/element[@name=\"PopulationPatientID\"]").Attributes["enc"].Value;// +"|" + xDoc.SelectSingleNode("./template/elements/element[@name=\"AdminDate\"]").Attributes["value"].Value;
                int enc = Int32.Parse(patientInfo.Split('|')[1]);
                if (enc > temp)
                {
                    lastEncounter.Add(enc, patientInfo);
                    temp = enc;
                }
                //lastEncounter.Add(Int32.Parse(patientInfo.Split('|')[1]));

                PatientList.Add( new SelectListItem { Text = popPatInfo, Value = patientInfo });
            }

Я думал об использовании некоторой временной переменной, чтобы выяснить, какое значение является самым высоким, а затем добавить эту строку в список. Я, однако, полностью рисую пробел ...

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Здесь я получаю идентификаторы анонимного типа, чтобы сделать его читаемым.

var patientEncounters= from patient in PatientList
                       let PatientID=Int32.Parse(patient.Value.Split('|')[0])
                       let EncounterID=Int32.Parse(patient.Value.Split('|')[1])
                       select new { PatientID, EncounterID };

Затем мы группируемся по ID пользователя и получаем последнее столкновение

var lastEncounterForEachUser=from pe in patientEncounters
                             group pe by pe.PatientID into grouped
                             select new 
                                    { 
                                        PatientID=grouped.Key,
                                        LastEncounterID=grouped.Max(g=>g.EncounterID)
                                    };
3 голосов
/ 09 сентября 2011

Линк не знает, как сравнивать 2 Patient объектов, поэтому он не может определить, какой из них "самый большой". Вам нужно заставить класс Patient реализовать IComparable<Patient>, чтобы определить, как Patient объекты сравниваются.

// Compare objets by Id value
public int CompareTo(Patient other)
{
    return this.Id.CompareTo(other.Id);
}

Другой вариант - использовать метод расширения MaxBy, доступный в проекте MoreLinq Джона Скита:

var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1])
                              .Select(x => x.MaxBy(p => p.Id));

РЕДАКТИРОВАТЬ: Я предполагал, что был класс Patient, но читая ваш код еще раз, я понимаю, что это не так. PatientList на самом деле является коллекцией SelectListItem, поэтому вам нужно реализовать IComparable в этом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...