14

ThenByが.Netでどのように機能するかを理解したいと思います。(私はそれを使用する方法を知っています、私はマイクロソフトがそれをどのように実装したかを理解していません!)

ドキュメントによると、string_list.OrderBy(Function (x) x.length).ThenBy(Function (x) x)文字列のリストを長さ順に出力し、次にアルファベット順に出力する必要があります。どうすればうまくいくでしょうか?!?最初の並べ替えは長さによるものです。2番目の並べ替えでは、最初の並べ替えを元に戻す必要があります。

このコードを想定します:

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
sorted_by_length = sorted_by_length.ThenBy(Function

これが私が使用せずに最後の行を実装しようとしているところですThenBy

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
'my implementation of OrderBy:
Dim e as IEnumerator(Of String) = sorted_by_length.GetEnumerator
Do While e.MoveNext
    'I have no idea what to write here!
Loop

ここでいくつかの魔法が起こっています...e.GetPreviousKeySelector()関数はありますか?実際、IOrderedEnumerableを返す関数を作成することすらできません。

4

1 に答える 1

17

どうすればうまくいくのでしょうか?!? 最初のソートは長さによるものです。2 番目の並べ替えは、最初の並べ替えを元に戻す必要があります。

いいえ、2 番目の並べ替え比較は、1 次比較で 2 つの等しい値が見つかった場合にのみ参照されます。

実装は、すべての比較を効果的に記憶することでこれを行います。IOrderedEnumerableつまり、別の言い方をすれば、「現在の比較と、それが 0 を返したときに参照する別の比較」から比較を構築できるようにすることです。

私は、LINQ to Objects をある程度深く掘り下げて、完全な代替実装を提供する一連のブログ投稿を行っています。の基礎はパート 26a26bIOrderedEnumerableでカバーされ、詳細と最適化は26c26dで説明されています。

実際、IOrderedEnumerable を返す関数を書くことさえできません。

から返された値を返すか、OrderBy自分で実装することで、絶対にできます。

于 2012-05-31T05:36:04.163 に答える