如何使我的通用比较器(IComparer)处理空值?
我正在尝试编写用于排序的通用对象比较器,但我注意到它不处理其中一个值比较为null的实例。 当一个对象为null时,我希望它对待它与空字符串相同。 我已经尝试将空值设置为String.Empty,但是当我在其上调用CompareTo()时,我得到“对象必须是String类型”的错误。
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);
if (SortDirection == SortDirection.Ascending) return Comparer.Default.Compare(obj1, obj2); else return Comparer .Default.Compare(obj2, obj1);
由于T
是generics类型,因此不能为其赋值String
值; 您只能为其指定类型为T
的值。 如果您只是使用它来比较字符串,请使用String
而不是T
否则,添加null检查并确定null
顺序应该落在哪里。
IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null) ?? ""; IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null) ?? "";
这基本上意味着obj1现在将是propertyInfo.GetValue(x,null)的值,或者如果恰好为null,则obj1将为“”。
或者,如果问题是GetValue在null上崩溃,您可以执行以下操作:
IComparable obj1 = ""; try { obj1 = (IComparable)propertyInfo.GetValue(x, null); } catch {}