LINQ对对象列表进行排序

时间:2018-02-20 20:16:37

标签: c# .net linq

我的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();

但似乎没有任何效果。请告诉我哪里错了。感谢

2 个答案:

答案 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);