List.Sort()在列表具有空值时失败

时间:2012-04-23 14:35:28

标签: c#

我有一个用户控件,网格使用ObjectDataSource获取数据。网格中的所有列都是可排序的。如果用户单击特定列名称,则会根据该列(List.Sort(sortColumn))对列表进行排序。

当其中一列的字段中包含空/空值时,我遇到了问题。当strA / strB为null或两者都为null时,比较行strA.CompareTo(strB)失败,并且“对象引用未设置为对象的实例”。

但是,我已经为strA和strB包含了!string.IsNullOrEmpty()以避免空引用异常。它仍然没有对网格进行排序。

下面给出了代码段。

int IComparer<MyWorklistItem>.Compare(MyWorkItem x, MyWorkItem y)
{
        int sortValue = 1;
        if (this.strSortField.Length == 0)
        {
            return 0;
        }
        MyWorkItem item1 = this.blnSortDesc ? y : x;
        MyWorkItem item2 = this.blnSortDesc ? x : y;

        PropertyInfo property1 = item1.GetType().GetProperty(this.strSortField);
        PropertyInfo property2 = item2.GetType().GetProperty(this.strSortField);

        string strA = (string)property1.GetValue(item1, null);
        string strB = (string)property2.GetValue(item2, null);

        if (!string.IsNullOrEmpty(strA) && !string.IsNullOrEmpty(strB))
        {               
            sortValue = strA.CompareTo(strB);
        }           
        return sortValue;
    }

当其中一个值或两者都为null时,如何排序。

注意:我使用的是VS 2005,所以LINQ没有可能。

请建议。

谢谢, 斯利拉姆

2 个答案:

答案 0 :(得分:3)

您可以使用静态string.Compare方法而不是实例方法来避免null的问题,因为您总是在比较字符串属性。

http://msdn.microsoft.com/en-us/library/system.string.compare.aspx

答案 1 :(得分:0)

在进行空检查之前,您正在对变量调用GetType

如果你在其他任何应该处理所有事情的事情之前进行空检查。