0

Pro LINQ:C#2008の統合言語クエリによると、 OrderBy演算子のプロトタイプは

public static IOrderedEnumerable<T> OrderBy<T, K>(
    this IEnumerable<T> source,
    Func<T, K> keySelector)
where
    K : IComparable<K>

しかし、MSDNのドキュメントには、 TKeyに関するジェネリックスの制約がありません。IComparable<TKey>

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

私は基本的に在庫をユニットで、次にサイズでソートしています。

    var sortedInventories = inventories
                            .OrderBy(inventory => inventory.Unit)
                            .OrderBy(inventory => inventory.Size);

上記のコードスニペットから、ラムダ式は単にインベントリプロパティを返し、並べ替えます。を返す式のようには見えませんIComparer<T>

しかし、ロジックによれば、ラムダ式はタイプである必要があるように見えますIComparer<T>

どちらが正しい宣言OrderByですか?
(Apress.comのエラッタページには情報がありません)

これが私がテストするために作成したサンプルアプリケーションですOrderBy

public class Program
{
    public static void Main(string[] args)
    {
        var inventories = new[] {
            new Inventory { Unit = 1, Size = 2 },
            new Inventory { Unit = 2, Size = 4 },
            new Inventory { Unit = 3, Size = 6 },
        };
        var sortedInventories = inventories
                                .OrderBy(inventory => inventory.Unit)
                                .OrderBy(inventory => inventory.Size);

        foreach (var inventory in sortedInventories)
            Console.WriteLine("Unit: {0}; Size = {1}", inventory.Unit, inventory.Size);
    }
}

public class Inventory
{
    public int Unit { get; set; }
    public double Size { get; set; }
}
4

1 に答える 1

4

2番目の「OrderBy」を「ThenBy」に変更します。現在、すべてを再利用しているため、サイズ、ユニットの順に効果的ですが、非効率的です。IComparer<T>別の議論として指定しない限り、どこに入るのかわかりません。基本的にはComparer<T>.Default、別の比較子を指定しない限り使用します。

とにかく、クエリは次のようになります。

var sortedInventories = inventories
                          .OrderBy(inventory => inventory.Unit)
                          .ThenBy(inventory => inventory.Size);

(テストデータでは、どちらの場合も違いがわかりませんSize = Unit * 2。ただし、ユニットが小さく、サイズが大きい1つのアイテムで試してください。)

はい、本の署名が少し間違っているようです。おそらくリリース直前に変更されたためです。基本的に間違った結果が出るのが心配なら、上記が説明です。

于 2009-03-29T21:58:02.793 に答える