List.Sort()行为错误

时间:2015-06-01 14:44:42

标签: c# linq

我有从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方法,但没有得到任何结果似乎一切都工作没有错误执行排序的结果:(

2 个答案:

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