c# - 如何让我的通用比较器 (IComparer) 处理空值?

标签 c# .net sorting icomparer

我正在尝试编写一个用于排序的通用对象比较器,但我注意到它不处理它比较的值之一为空的实例。当一个对象为 null 时,我希望它像对待空字符串一样对待它。我已尝试将空值设置为 String.Empty,但随后在调用 CompareTo() 时出现“对象必须是字符串类型”的错误。

public int Compare(T x, T y)
{
    PropertyInfo propertyInfo = typeof(T).GetProperty(sortExpression);
    IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
    IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);

    if (obj1 == null) obj1 = String.Empty; // This doesn't work!
    if (obj2 == null) obj2 = String.Empty; // This doesn't work!

    if (SortDirection == SortDirection.Ascending)
        return obj1.CompareTo(obj2);
    else
        return obj2.CompareTo(obj1);
}

我现在很纠结这个!任何帮助将不胜感激。

最佳答案

您不能将T 视为空字符串,除非您的T 被有效地限制为字符串。您应该 做的是制定一个比较空值的计划。比如

if (obj1 == null && obj2 == null)
   return 0;
else if (obj1 == null)
   return -1;
else if (obj2 == null)
   return 1;
else 
   return obj1.CompareTo(obj2);

关于c# - 如何让我的通用比较器 (IComparer) 处理空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852432/

相关文章:

c# - 动态控件不显示

python - 嵌套列表排序 python 3

algorithm - 使用归并排序计算反转次数

ios - 使用 sqlite 数据按字母顺序对 UITableView 进行排序

c# - 如何更改 Windows Phone 8,8.1 中的默认视频捕获分辨率

c# - 文字转语音不适用于不同的安卓手机

通用扩展方法的 C# 特化

c# - 找不到 Microsoft.SqlServer.Types 的版本 10 或更高版本

.net - 在 32 位 Visual Studio 的同时在 64 位机器上进行调试

c# - 使用 EPPlus 将背景图像添加到 Excel 不起作用