我的List<Clinics>
有一个名为List<Doctors>
的属性(另一个类)。每个Doctors
都有一个名为AverageCost
的属性。我想创建一个LINQ,根据所有医生和List<Clinics>
ThenBy
的最低平均费用对ClinicID
进行排序。
我尝试过使用
clinics = clinics.OrderBy(f => {
f.Doctors = f.Doctors.OrderBy(p => p.AverageCost).ToList();
return f;
})
.ThenBy(f => f.ClinicId).ToList();
还
clinics = (from t in clinics select t).OrderBy(x => x.Doctors.OrderBy(z => z.AverageCost)).ToList();
但似乎没有任何效果。请告诉我哪里错了。感谢
答案 0 :(得分:3)
您的实现不起作用的原因是OrderBy
期望每个元素返回单个“事物”,通过它可以比较元素。您的实现返回列表,这些列表没有内置的方法可以相互比较。
您无需按平均成本订购医生,只需使用Min()
功能选择最低费用:
clinics = clinics
.OrderBy(f => f.Doctors.Min(d => d.AverageCost))
.ThenBy(f => f.ClinicId)
.ToList();
答案 1 :(得分:1)
所以每个诊所都有零个或多个医生。每位医生都有一个属性AverageCost。
我想根据所有的最低平均成本对诊所进行排序 医生
您的意思是(医生的平均成本)的最低平均值,或者您想要由最便宜的医生=平均成本最低的医生订购?
Clinic A:
Doctor A1: Average cost 10
Doctor A2: Average cost 50
Clinic B:
Doctor B1: Average cost 25
Doctor B2: Average cost 15
A1医生是ClinicA最便宜的医生,平均费用为10.医生B2是ClinicB最便宜的医生,平均费用为25美元。
如果排序“所有医生的最低平均成本”意味着您希望按最便宜的医生排序,那么您将获得诊所A,然后是诊所B
如果“所有医生的最低平均成本”是指每个诊所的平均成本,您可以获得ClinicA平均所有医生的费用(10 + 50)/ 2 = 30; ClinicB的平均成本超过所有医生(25 + 15)/ 2 = 20.您将首先获得ClinicB,然后是ClinicA
你想要哪一个?
由最便宜的医生订购
var result = Clinics.Select(clinic => new
{
CheapestDoctor = clinic.Doctors
.OrderBy(doctor => doctor.AverageCost)
.FirstOrDefault(),
Clinic = clinic,
})
.OrderBy(clinic => clinic.CheapestDoctor.AverageCost)
.Select(clinic => clinic);
(TODO:决定在没有医生的情况下如何处理诊所)
按总体平均排名
排序var result = Clinics.Select(clinic => new
{
OverallAverage = clinic.Doctors
.Select(doctor => doctor.AverageCost)
.Average(),
Clinic = clinic,
})
.OrderBy(clinic => clinic.OverallAverage)
.Select(clinic => clinic);