34

オブジェクトには、 Reverse()Listというメソッドがあります。 リストの順序を「インプレース」と逆にし、何も返しません。

オブジェクトには、 Reverse()IEnumerableという拡張メソッドがあります。 別のIEnumerableを返します。

リスト全体を逆の順序で繰り返す必要があるため、2番目の方法を直接使用することはできません。これは、リストを取得し、それを逆にしたくないので、逆に繰り返すだけです。

だから私はこれを行うことができます:

for(int i = list.Count - 1; i >=0; i--)

または

foreach(var item in list.AsEnumerable().Reverse())

IEnumerableを使用している場合よりも読みにくいことがわかりました。

foreach(var item in list.Reverse())

この2つのメソッドが同じ名前でこのように実装されている理由がわかりません。それはかなり迷惑で混乱を招きます。

すべてのIEnumerableで機能するReverse()の代わりにBackwardsIterator()という拡張機能がないのはなぜですか?

私はこの選択の歴史的な理由に非常に興味があります。

4

3 に答える 3

27

listメソッドはextensionメソッドよりもはるかに古いことに注意してください。Reverse命名は、より簡潔に見えるのと同じに保たれた可能性がありBackwardsIteratorます。

IEnumerable<T>リストバージョンをバイパスして拡張メソッドに移動する場合は、リストを:のように扱う必要があります。

var numbers = new List<int>();
numbers.Reverse(); // hits list
(numbers as IEnumerable<int>).Reverse(); // hits extension

または、拡張メソッドを静的メソッドとして呼び出します。

Enumerable.Reverse(numbers);

Enumerableバージョンは、逆に反復を開始するために、基になる列挙可能オブジェクトを完全に反復する必要があることに注意してください。同じ列挙可能オブジェクトに対してこれを複数回実行することを計画している場合は、順序を永続的に逆にして、通常どおりに繰り返すことを検討してください。

于 2012-09-12T14:57:26.040 に答える
5

その後、独自のBackwardsIteratorを作成してください。

public static IEnumerable BackwardsIterator(this List lst)
{
    for(int i = lst.Count - 1; i >=0; i--)
    {
        yield return lst[i];
    }
}
于 2012-09-12T14:57:34.113 に答える