我有一个简单的Patient类,其属性如
public int PatientId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
和一个根据他们的PatientId返回随机患者的功能
public static Patient GetRandomPatient(IEnumerable<Patient> patList)
{
Random r = new Random();
int patientValue = r.Next(patList.Min().PatientId, patList.Max().PatientId);
//return from g in patList
// where g.PatientId == patientValue
// select g;
var test = from g in patList
where g.PatientId == patientValue
select g;
return (Patient)test;
}
注释掉的行是第一次尝试返回由Random类选择PatientId的患者。这没有编译,我得到了错误
Cannot implicitly convert type... (are you missing a cast)?
然后我运行了未注释掉的迭代并得到了异常
At least one object must implement IComparable
。
然后我尝试了这个作为我的回复陈述
Patient testPatient = patList.First(x => x.PatientId == patientValue);
return testPatient;
这编译没有错误,但是当我运行它时,我得到一个对象必须实现IComparable的相同异常。
我想知道两件事 1.在使用LINQ语法从列表中返回单个对象时,我似乎没有达到这个概念(在这种情况下,每个PatientId都是唯一的,因此return语句只能返回一个Patient对象)? 2.为什么代码
Patient testPatient = patList.First(x => x.PatientId == patientValue);
return testPatient;
编译并且没有编译器错误,但是其他迭代具有相同异常的炸弹?
主要功能
List<Patient> patientList = new List<Patient>();
patientList.Add(new Patient() { PatientId = 101, FirstName = "John", LastName = "Jacosdfasdfasdfb" });
patientList.Add(new Patient() { PatientId = 100, FirstName = "Mary", LastName = "Wilson" });
patientList.Add(new Patient() { PatientId=102, FirstName="Max",LastName="Payne"});
//Call that bombs the program Console.WriteLine(Patient.GetRandomPatient(patientList).PatientId);
答案 0 :(得分:7)
由于错误试图告诉您,您的.Min()
和.Max()
来电没有意义。
您只能在可以与其他对象进行比较的对象集合上调用Min()
或Max()
。
相反,您需要在ID集合上调用它们:
patients.Select(p => p.PatientId).Min()
您还可以使用更简单(更快)的
替换整个功能return patients.ElementAt(rand.Next(patients.Count()));
答案 1 :(得分:0)
当谈到第一个语句时我很好奇其余的错误消息,哪些类型不能被隐式转换,我的赌注是PatientId是字符串或可空的int(int?)而你正在用一个正常整数进行比较
//return from g in patList
// where g.PatientId == patientValue
// select g;