4

一般的な List<> をソートするためにこのメソッドを使用してきました。最近、T のターゲット プロパティが null 許容型 (10 進数?) の場合に誤った結果が生じることに気付きました。修正方法はありますか?

public void SortList<T>(List<T> dataSource, string fieldName, SortDirection sortDirection)
{
    PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
    Comparison<T> compare = delegate(T a, T b)
    {
        bool asc = sortDirection == SortDirection.Ascending;
        object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
        object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);

        return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
    };
    dataSource.Sort(compare);
}

上記の Phil Hustead の記事「Sorting Generic Lists and IEnumerables by Object Property Name」のコード http://www.codeproject.com/Articles/27851/Sorting-Generic-Lists-and-IEnumerables-by-Object-P

たとえば、null 許容の decimal プロパティHoursを持つEmployeeオブジェクトの場合。

null 許容時間 107, null, 8, 152, 64, nullは8, null, 64, null, 107, 152 に ソートされ ます。

ヌルは、リストの先頭または末尾にソートする必要があると思います。

4

2 に答える 2

4

メソッドを次のように変更します

public static void SortList<T>(List<T> dataSource, string fieldName, SortDirection sortDirection)
{
    PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
    Comparison<T> compare = delegate(T a, T b)
    {
        bool asc = sortDirection == SortDirection.Ascending;
        object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
        object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);

        if(valueA == null)
        {
            if(valueB == null)
            {
                return 0;
            }
            else
            {
                return asc ? -1 : 1;
            }
        }
        if(valueB == null)
        {
            return asc ? 1 : -1;
        }

        return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
    };
    dataSource.Sort(compare);
}

主な問題は、あなただけをチェックvalueAしていることです。null 許容値がボックス化されている場合 (これがまさにここで起こっていることです)、実際の値または で表されます。IComparablevalueA == nullvalueBnull

于 2012-07-07T15:35:00.563 に答える
0

null 許容値をサポートする上記 (最終) の例は、私のリストではうまく機能しますが、特定のシナリオでのみ機能します。私の CustomType には 4 つのフィールドが含まれており、そのうちの 2 つは文字列型で、2 つは DateTime ですか? (null 許容) 型。

文字列値のいずれかで並べ替えると、うまく機能します。ただし、null 可能な DateTime のいずれかで並べ替えると? 値、それは1つのDateTimeをソートしますか? 値は適切ですが、文字列値の情報は「失われます」!

指定された DateTime で並べ替えられたリストが残っていますか? 値、およびまだ他の DateTime を含んでいますか? 値ですが、文字列値が空ですか?

ここに何かアイデアはありますか?

于 2015-01-23T22:44:55.797 に答える