如果我理解正确,也许这就是你所追求的:
var targetDay = DateTime.Now; //set to Jan 1st
var result =
monthylConsumptions.OrderBy(
x =>
x.DailyConsumptions.Where(y => y.Day.Date == targetDay.Date).Select(z => (!z.Value.HasValue ? 0 : z.Value.Value)).SingleOrDefault());
根据您的示例,“targetDay”应设置为 1 月 1 日。
这将在您指定的日期按值升序排序,并在该特定月度中没有值时考虑默认值。
编辑:
我刚刚测试了以下单元测试,它通过了,没有显示您描述的错误:
[TestFixture]
public class LinqSortTest
{
public class MonthlyConsumption
{
public string Unit { get; set; }
public List<DailyConsumption> DailyConsumptions { get; set; }
}
public class DailyConsumption
{
public DateTime Day { get; set; }
public double? Value { get; set; }
}
[Test]
public void SomeTest()
{
var targetDay = new DateTime(2013, 1, 1);
var monthlyConsumptions = new List<MonthlyConsumption>();
monthlyConsumptions.Add(new MonthlyConsumption
{
Unit = "first",
DailyConsumptions = new List<DailyConsumption>
{
new DailyConsumption { Day = new DateTime(2013, 1, 1), Value = 5 },
new DailyConsumption { Day = new DateTime(2013, 1, 5), Value = 100 }
}
});
monthlyConsumptions.Add(
new MonthlyConsumption
{
Unit = "second",
DailyConsumptions =
new List<DailyConsumption>
{
new DailyConsumption { Day = new DateTime(2013, 1, 1), Value = 2 },
new DailyConsumption { Day = new DateTime(2013, 1, 5), Value = 1 }
}
});
var result =
monthlyConsumptions.OrderBy(
x =>
x.DailyConsumptions.Where(y => y.Day.Date == targetDay.Date).Select(
z => (!z.Value.HasValue ? 0 : z.Value.Value)).SingleOrDefault()).ToList();
Assert.AreEqual("second", result[0].Unit);
}
}
如您所见,Assert确认确实将第二项放在第一位,因为“第二”的 1 月 1 日值低于“第一”。