2013-09-30 7 views
10

私は、4回呼び出されているメソッドの内部で使用されている汎用リストを持っています。このメソッドは、この汎用リストの値とともにPDFにテーブルを書き込みます。同じリストを変更せずに汎用リストを元に戻すにはどうすればいいですか?

私の問題は、メソッド内でこのジェネリックリストを逆にする必要がありますが、メソッドを呼び出すたびにリストが逆転するようにメソッドを4回コールしています。私に何ができる?オリジナルを改ざんすることなくリストを逆にする方法はありますか?

これはメソッド内である:

t.List.Reverse(); 
foreach (string t1 in t.List) 
{ 
    //Some code 
} 
+0

として使用することができ、それは方法、または何か他のものへの呼び出しから生成されますか? – Servy

答えて

23

「簡単」オプションは、ただ、実際にリスト自体を変更することはなく、それを最初の時間を逆にしようとせず、逆の順序でリストを反復して行うことを知っているだろう何も他の回:

foreach (string t1 in t.List.AsEnumerable().Reverse()) 
{ 
    //Some code 
} 

代わりListリバースのLINQ Reverse方法を用いることにより、我々はリストを変異させずに後方にそれを繰り返すことができます。 は、ListReverseメソッドが使用されないようにする必要があります。

+0

これは私が探していたものです!あなたLinq !!!ありがとうございました...とServyもちろん:) –

6

あなたは、元を変異させずに、リストの逆のコピーを作成する方法を求めています。

LINQはそれを行うことができます。

foreach (var t1 in Enumerable.Reverse(t.List)) 
1

2つのうちのいずれかを実行できます。どちらの方法からリストを逆に取ると方法を4回呼び出す前に、リストを一度逆転、または実行します。それを逆転させる前に、リストのコピーをとる

List<My_Type> new_list = new List<Int32>(t.List); 
new_list.Reverse(); 

ので、あなたは、元のリストには手を触れないでください。

今では、1回ではなく4回リバースを呼び出すので、最初の方法をお勧めします。

1

これまで指定されたすべてのオプションは、内部的にすべての要素を別のリストに逆順にコピーします。具体的には、new_list.Reverse()または暗黙的なt.List.AsEnumerable().Reverse()です。私は以下の拡張方法としてこのコストを持たないものを好む。

public class ListExtetions { 
    public static IEnumerable<T> GetReverseEnumerator(this List<T> list) { 
     for (int i = list.Count - 1; i >= 0; i--) 
       return yeild list[i]; 
    } 
} 

そして

は、それがその型のインスタンスフィールドで、

リストが渡されている
foreach (var a in list.GetReverseEnumerator()) { 

} 
関連する問題