C# 错误的List.Sort()行为
我有一个从EF DB上下文检索到的位置对象列表C# 错误的List.Sort()行为,c#,linq,C#,Linq,我有一个从EF DB上下文检索到的位置对象列表 +--------+---------------------+-------+-------+ | ID | FullDate | Year | Month | +--------+---------------------+-------+-------+ | 21952 | null | 2015 | 1 | | 21953 | null
+--------+---------------------+-------+-------+
| 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));
}
每次我尝试排序时,最后一行并没有改变,即使在comparator表达式中返回1,也并没有任何改变。我尝试过调试Comparator方法,但没有得到任何结果除了排序的结果之外,一切似乎都可以正常工作:(不确定排序为什么不起作用,但这应该:
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);
不确定排序不起作用的原因,但这应该:
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);
不确定排序不起作用的原因,但这应该:
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);
不确定排序不起作用的原因,但这应该:
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);
它们实际上不能相等,因为它们将有不同的Id,并且在相同日期的情况下,comparator方法将比较Id 您仍然需要编写“equals”大小写,因为。将项目与自身进行比较应始终返回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;
});
如果愿意,您可以重新排列或在逻辑上减少比较,但逻辑应该是相同的
它们实际上不能相等,因为它们将有不同的Id,并且在相同日期的情况下,comparator方法将比较Id 您仍然需要编写“equals”大小写,因为。将项目与自身进行比较应始终返回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;
});
如果愿意,您可以重新排列或在逻辑上减少比较,但逻辑应该是相同的
它们实际上不能相等,因为它们将有不同的Id,并且在相同日期的情况下,comparator方法将比较Id 您仍然需要编写“equals”大小写,因为。将项目与自身进行比较应始终返回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;
});
如果愿意,您可以重新排列或在逻辑上减少比较,但逻辑应该是相同的
它们实际上不能相等,因为它们将有不同的Id,并且在相同日期的情况下,comparator方法将比较Id 您仍然需要编写“equals”大小写,因为。将项目与自身进行比较应始终返回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;
});
如果您愿意,您可以重新排列或逻辑上减少比较,但逻辑应该是相同的。我还尝试手动更改palces 21983和21984,然后对集合进行排序,得到了相同的结果。我添加了一些手表以查找集合中的更改,因此我发现集合中的这两个元素发生了更改它们的位置如果有匹配的行,则不会返回0。首先,一个简短但完整的程序演示此问题确实会有所帮助。您的比较函数不正确,因为它允许以下操作:
Compare(A,b)=>-1
和Compare(b,A)=>-1
(在这些情况下,您应该返回0)。它们实际上不能相等,因为它们将具有不同的Id,并且在相同日期if(xDate==yDate&&x.Id>y.Id){return 1;}的情况下,comparator方法将比较Id
@EBrownList.Sort
不会返回任何内容-它会对列表进行适当的排序。我还尝试手动更改palces 21983和21984,然后对集合进行排序,得到了相同的结果。我添加了一些手表以查找集合中的更改,因此我发现集合中的这两个元素已更改了位置。您如果你有匹配的行,你就不会返回0。首先,一个简短但完整的程序来演示这个问题确实会有帮助。你的比较函数是不正确的,因为它允许以下操作:Compare(A,b)=>-1
和Compare(b,A)=>-1
,当它们实际上相等时(在这些情况下,您应该返回0)。它们实际上不能相等,因为它们将具有不同的Id,并且在相同日期if(xDate==yDate&&x.Id>y.Id){return 1;}的情况下,comparator方法将比较Id
@EBrownList.Sort
不会返回任何内容-它会对列表进行适当的排序。我还尝试手动更改palces 21983和21984,然后对集合进行排序,得到了相同的结果。我添加了一些手表以查找集合中的更改,因此我发现集合中的这两个元素已更改了位置。您如果你有匹配的行,你就不会返回0。首先,一个简短但完整的程序来演示这个问题确实会有帮助。你的比较函数是不正确的,因为它允许以下操作:Compare(A,b)=>-1
和Compare(b,A)=>-1
,当它们实际上相等时(在这些情况下,您应该返回0)。它们实际上不能相等,因为它们将具有不同的Id,并且在相同日期if(xDate==yDate&&x.Id>y.Id){return 1;}的情况下,comparator方法将比较Id
@EBrownList.Sort
不会返回任何内容-它会对列表进行适当的排序。我还尝试手动更改palces 21983和21984,然后对集合进行排序,得到了相同的结果。我添加了一些手表以查找集合中的更改,因此我发现集合中的这两个元素已更改了位置。您如果你有匹配的行,你就不会返回0。首先,一个简短但完整的程序来演示这个问题确实会有帮助。你的比较函数是不正确的,因为它允许以下操作:Compare(A,b)=>-1
和Compare(b,A)=>-1
,当它们实际上相等时(在这些情况下,您应该返回0)。它们实际上不能相等,因为它们将具有不同的Id,并且如果(xDate==yDate&&x.Id>y.Id){返回1,则comparator方法将在相同日期的情况下比较Id