我有从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方法,但没有得到任何结果似乎一切都工作没有错误执行排序的结果:(
答案 0 :(得分:3)
它们实际上并不相同,因为它们会有不同的ID,比较器方法会在相同日期的情况下比较Id
你仍然需要编码"等于"因为List.Sort
will compare an item to itself at certain points in the process。将项目与自身进行比较总是返回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;
});
如果您愿意,可以重新排列或逻辑地减少比较,但逻辑应该相同。
答案 1 :(得分: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);