gpt4 book ai didi

c# - 如何更正通用排序代码以对可空类型进行排序

转载 作者:太空狗 更新时间:2023-10-30 01:23:23 25 4
gpt4 key购买 nike

我们一直在使用这种方法对通用列表<>进行排序。最近,当 T 中的目标属性是可空类型(十进制?)时,我们注意到不正确的结果。任何想法如何纠正?

public void SortList<T>(List<T> dataSource, string fieldName, SortDirection sortDirection)
{
PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
Comparison<T> compare = delegate(T a, T b)
{
bool asc = sortDirection == SortDirection.Ascending;
object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);

return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
};
dataSource.Sort(compare);
}

以上代码来自 Phil Hustead 的文章“按对象属性名称对通用列表和 IEnumerables 进行排序” http://www.codeproject.com/Articles/27851/Sorting-Generic-Lists-and-IEnumerables-by-Object-P

例如,对于我的 Employee 对象,其具有可为 null 的十进制属性 Hours

可为空的时间107、空、8、152、64、空分类为8、null、64、null、107、152

我认为,空值应该排序到列表的开头或结尾。

最佳答案

将您的方法更改为

public static void SortList<T>(List<T> dataSource, string fieldName, SortDirection sortDirection)
{
PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
Comparison<T> compare = delegate(T a, T b)
{
bool asc = sortDirection == SortDirection.Ascending;
object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);

if(valueA == null)
{
if(valueB == null)
{
return 0;
}
else
{
return asc ? -1 : 1;
}
}
if(valueB == null)
{
return asc ? 1 : -1;
}

return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
};
dataSource.Sort(compare);
}

主要问题是您正在检查 valueA 仅用于 IComparable,如果 valueA == null - 比较返回对象相等,无论 valueB 中是什么。当可空值被装箱时(这正是此处发生的情况),它由实际值或 null 表示。

关于c# - 如何更正通用排序代码以对可空类型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com