[英]How can I make my generic comparer (IComparer) handle nulls?
我正在嘗試編寫用於排序的通用對象比較器,但我注意到它不處理其中一個值比較的實例為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<T>.Default.Compare(obj1, obj2);
else
return Comparer<T>.Default.Compare(obj2, obj1);
由於T
是泛型類型,因此不能為其賦值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 {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.