2013-07-03 34 views
0
函数抛出

我有与性能的简单Patient类像异常使用LINQ

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

于是我想这是我的return语句

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

可以将随机实例作为参数传递给方法,也可以在类中使用静态字段。否则,如果您在循环中调用“GetRandomPatient”,它将不会生成随机值,因为它的播种时间与播种时间一致。 –

+0

@TimSchmelter:并注意'Random'不是线程安全的。 – SLaks

+0

@SLaks你可以扩大这些影响? – wootscootinboogie

回答

7

由于错误是想告诉你,你的.Min().Max()通话没有任何意义。
您只能在可与其他对象进行比较的对象集合上调用Min()Max()

相反,你需要给他们打电话的ID的集合:

您也可以使用简单的替换整个功能,速度更快

return patients.ElementAt(rand.Next(patients.Count())); 
+0

啊,我明白我所做的。我想要做的是让最大和最小呼叫找到最大和最小PatientId,所以随机数发生器不会选择该范围以外的值。我现在可以看到我所做的没有意义。 – wootscootinboogie

+0

请注意'Min'和'Max'每个都将选择器作为参数,所以您不必先调用'Select',您可以直接将'p => p.PatientId'传递给这些方法。 – Servy

+0

@Servy:是的;我忘了那个。 – SLaks

0

当涉及到第一条语句我很好奇剩下的错误信息,哪些类型不能隐式转换,我敢打赌,当你用一个正常的整数进行编译时,PatientId是字符串或可为空的int(int?)。

//return from g in patList 
    //  where g.PatientId == patientValue 
    //  select g; 
+0

您可以从Main函数中的代码看到PatientId是int。问题在于我对Random类的Next()函数的调用。我打算得到最大和最小的PatiendIds,并没有这样做。 – wootscootinboogie

+0

对不起,我现在看到了,不理我的答案。 – Marcus