我有一个列表位置对象,我从EF DB上下文
检索+--------+---------------------+-------+-------+
| ID | FullDate | Year | Month |
+--------+---------------------+-------+-------+
| 21952 | null | 2015 | 1 |
| 21953 | null | 2015 | 1 |
| 21954 | null | 2015 | 1 |
| 21955 | null | 2015 | 2 |
| 21956 | null | 2015 | 1 |
| 21957 | null | 2015 | 2 |
| 21958 | null | 2015 | 3 |
| 21959 | null | 2015 | 1 |
| 21960 | null | 2015 | 1 |
| 21961 | null | 2015 | 1 |
| 21962 | null | 2015 | 2 |
| 21963 | null | 2015 | 2 |
| 21964 | null | 2015 | 2 |
| 21965 | null | 2015 | 2 |
| 21966 | 01.02.2015 0:00:00 | null | null |
| 21967 | null | 2015 | 2 |
| 21968 | null | 2015 | 2 |
| 21969 | null | 2015 | 2 |
| 21970 | null | 2015 | 2 |
| 21971 | null | 2015 | 3 |
| 21972 | null | 2015 | 3 |
| 21973 | null | 2015 | 3 |
| 21974 | null | 2015 | 3 |
| 21975 | null | 2015 | 3 |
| 21976 | null | 2015 | 4 |
| 21977 | null | 2015 | 4 |
| 21978 | null | 2015 | 4 |
| 21979 | null | 2015 | 4 |
| 21980 | null | 2015 | 4 |
| 21981 | null | 2015 | 5 |
| 21982 | null | 2015 | 5 |
| 21984 | null | 2015 | 6 |
| 21983 | null | 2015 | 5 |
+--------+---------------------+-------+-------+
我已经实现了这样的排序:
positions.Sort((x, y) =>
{
var xDate = getActualDate(x.FullDate, x.Year, x.Month);
var yDate = getActualDate(y.FullDate, y.Year, y.Month);
if (xDate > yDate)
{
return 1;
}
if (xDate == yDate && x.Id> y.Id)
{
return 1;
}
return -1;
});
获取实际日期的方法是
private DateTime getActualDate(DateTime? fullDate, int? year, int? month)
{
return fullDate.HasValue ? fullDate.Value : new DateTime(year.Value, month.Value, DateTime.DaysInMonth(year.Value, month.Value));
}
每次我尝试排序最后一行没有改变,即使在比较器表达式返回1什么都没有改变。我试过调试Comparator方法,但没有得到任何结果,一切似乎都没有错误,除了排序的结果:(
它们不可能相等因为它们有不同的Id如果日期相等,comparator方法会比较Id
您仍然需要编写一个"等于"的情况,因为List.Sort
将在过程中的某些点将项目与自身进行比较。将一个项与自身进行比较,应该总是返回0。
幸运的是,这种情况很容易注入:
positions.Sort((x, y) =>
{
var xDate = getActualDate(x.FullDate, x.Year, x.Month);
var yDate = getActualDate(y.FullDate, y.Year, y.Month);
if (xDate == yDate && x.Id == y.Id)
{
return 0;
}
if (xDate > yDate)
{
return 1;
}
if (xDate == yDate && x.Id> y.Id)
{
return 1;
}
return -1;
});
如果你愿意,你可以重新排列或逻辑上减少比较,但逻辑应该是相同的。
不知道为什么排序不工作,但这应该:
var result=positions.Select(p=> new {
id,
date = p.fullDate ?? new DateTime(p.year.Value, p.month.Value, DateTime.DaysInMonth(p.year.Value, p.month.Value))
}).OrderBy(p=>p.date)
.ThenBy(p=>p.id);