簡體   English   中英

如何使我的通用比較器(IComparer)處理空值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM