2011-01-12 17 views
9

List<T>.Reverse()Reverse(this IEnumerable<TSource> source)に問題があります。コードへ ルック:IList <>。Reverse()はList <>()のように動作しません。逆

// Part 1 
    List<int> list = new List<int> { 1, 2, 3 }; 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 

    list.Reverse(); 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 
    list.Reverse(); 

    // Part2 
    IList<int> ilist = list; 

    foreach (int x in list) 
    Console.Write(x);  

    Console.WriteLine(); 

    ilist.Reverse(); 

    foreach (int x in ilist) 
    Console.Write(x); 

    Console.WriteLine(); 

    ilist.Reverse(); 

マイ結果:

123 
321 
123 
123 

Reverse() -Part1がList<T>.Reverse()あるので、Reverse() -Part2は私がIList<int>のためにパート2にList<int>.Reverse()を実行したいReverse(this IEnumerable<TSource> source) です。私はそれをどのようにすることができますか?

+2

を言うだろう、と言うことです[私はこれが混乱していることをあなたに同意。](http://stackoverflow.com/questions/2828917/most-厄介な - 誤解を招く - net-api/2829051#2829051) –

答えて

8

IList<int>Reverseメソッドを持たないため、拡張メソッドを使用します。 IList<int>参照にList<T>.Reverseを使用する唯一の方法は、キャストしてList<int>に変換することです。あなたはそれが本当に最初の場所でList<int>だと確信している場合には、鋳造にのみ動作します:

IList<int> abstractList; 
var concreteList = (List<int>)abstractList; 
concreteList.Reverse(); 

は別のオプションではなく、すでにそれを想定したよりも、あなたのIList<int>インスタンスからList<int>を作成になりList<int>次のとおりです。それはIEnumerable<T>上で動作するので

IList<int> abstractList; 
var concreteList = new List<int>(abstractList); 
concreteList.Reverse(); 

Reverse拡張メソッドは、実際に根本的なリストには影響しません理由は、W、ありますこれは必ずしも書き込み可能ではありません(Enumerable拡張メソッドのどれもが元のコレクションに変更を加えず、の新しいコレクションを返します)。

だけではなく、元のリストよりも、Reverseコールの製品を使用し、Reverseのこのバージョンを使用するには:IEnumerable<T>に対して、あなたが拡張メソッドを使用している2番目の例では

IList<int> abstractList; 
IEnumerable<int> reversedList = abstractList.Reverse(); 
4

、このオリジナルのコレクションに変更を加えるのではなく、元のリストの順序が逆の順序になるクエリを生成します。それはあなたがilist.Reverse()の結果を利用したい場合、あなたは

var reversedList = iList.Reverse(); 
// reversedList is IEnumerable<int> 
// 'list' and 'ilist' are not changed 

foreach (int item in reversedList) 
    Console.Write(item); 
+0

短く、手元の問題への簡潔な答え。私を助けました。ありがとう+1 –

関連する問題