至少有一个对象必须实现Icomparable

时间:2011-09-09 12:19:18

标签: linq c#-4.0

我试图在类似值的列表中获取唯一值,仅由管道分隔字符串中的一个元素区分...我一直得到至少一个对象必须实现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 });
            }

我正在考虑使用某种临时变量来找出最高值,然后将该字符串添加到List中。我总是画一个空白......

2 个答案:

答案 0 :(得分:3)

Linq不知道如何比较2个Patient个对象,因此无法确定哪个是“最大”。您需要制作Patient类工具IComparable<Patient>,以定义比较Patient个对象的方式。

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

另一种选择是使用Jon Skeet的MoreLinq项目中提供的MaxBy扩展方法:

var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1])
                              .Select(x => x.MaxBy(p => p.Id));
编辑:我认为有一个Patient课程,但是再次阅读你的代码,我意识到情况并非如此。 PatientList实际上是SelectListItem的集合,因此您需要在该类中实现IComparable

答案 1 :(得分:3)

这里我以匿名类型获取ID以使其可读。

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

然后我们按UserID分组并获得最后一次遇到

var lastEncounterForEachUser=from pe in patientEncounters
                             group pe by pe.PatientID into grouped
                             select new 
                                    { 
                                        PatientID=grouped.Key,
                                        LastEncounterID=grouped.Max(g=>g.EncounterID)
                                    };