Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 至少一个对象必须实现Icomparable_Linq_C# 4.0 - Fatal编程技术网

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

Linq 至少一个对象必须实现Icomparable,linq,c#-4.0,Linq,C# 4.0,我试图在类似值的列表中获取唯一值,这些值仅由管道分隔字符串中的一个元素区分。。。我一直得到至少一个对象必须实现Icomparable。我不明白为什么我总是这样。我可以根据该值进行分组。。。为什么我找不到max。。。我猜它是在寻找可以与之比较的东西。如果我得到整数版本,它会停止对我大喊大叫吗?这是我最后一次尝试使用LINQ var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1]).Select(x =>

我试图在类似值的列表中获取唯一值,这些值仅由管道分隔字符串中的一个元素区分。。。我一直得到至少一个对象必须实现Icomparable。我不明白为什么我总是这样。我可以根据该值进行分组。。。为什么我找不到max。。。我猜它是在寻找可以与之比较的东西。如果我得到整数版本,它会停止对我大喊大叫吗?这是我最后一次尝试使用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 });
            }

我在考虑使用某种temp变量来找出最大值,然后将该字符串添加到列表中。我完全是一片空白,但是…

Linq不知道如何比较2个
患者
对象,所以它无法确定哪一个是“最大的”。您需要使
Patient
类实现
i可比较
,以定义如何比较
Patient
对象

// Compare objets by Id value
public int CompareTo(Patient other)
{
    return this.Id.CompareTo(other.Id);
}
另一种选择是使用Jon Skeet项目中可用的
MaxBy
扩展方法:


编辑:我假设有一个
患者
课程,但再次阅读您的代码,我意识到情况并非如此
PatientList
实际上是
SelectListItem
的集合,因此您需要在该类中实现
IComparable

这里我以匿名类型获取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 };
然后我们按用户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)
                                    };

我不明白为什么我不能深入到Int32.Parse(Value.Split(“|”)[1])并让它进行比较。@DmainEvent,我不确定我是否理解您真正想要做什么。。。在
Select
调用中,x是一个
i分组
,因此其项的类型为
SelectListItem
。您可以通过
Int32.Parse(Value.Split(“|”)[1])
找到最大值,但这没有什么意义,因为同一组中的所有项目都具有相同的值,因为该患者只是一个选择列表项目。我在值字符串中有最高的值。我只是把它分开。我看过这个DLL,我真的厌倦了把别人的DLL放在我的产品代码中。在我看来,这是一种非常糟糕的形式。也许我应该按照第一次拆分进行分组,然后在第二次拆分时获得最大值。“我真的厌倦了在我的产品代码中放置其他人的dll”:所以你从不使用任何第三方库?!在右选择列表项中,该值具有患者ID和遭遇ID。最高的遭遇ID将是最后一次遭遇。初始列表中可能有多个项目都是相同的患者(相同的患者ID…但也可能有多个不同的患者ID)。但是SelectListItem的每个值都有一个遭遇ID。最高的是最近的遭遇。我想要每个患者ID的最后一次遭遇,我想要列表中的那些。。。我认为第一组是按患者ID分组的,然后选择这些遭遇ID的最大值。这是否正确?patient.Value.Split(“|”)[0]是PatientID,patient.Value.Split(“|”)[1]是遇到了确定的事情。刚走开一分钟,我试了一下,效果很好。记住,尽管它将返回匿名类型。如果你想传递它,你应该创建一个类。我认为它是有效的。我只需要将结果返回到selectListItem的一些方法中。
var lastEncounterForEachUser=from pe in patientEncounters
                             group pe by pe.PatientID into grouped
                             select new 
                                    { 
                                        PatientID=grouped.Key,
                                        LastEncounterID=grouped.Max(g=>g.EncounterID)
                                    };