2013-09-30 4 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 메서드를 사용하지 못하게하려면 AsEnumerable이 있어야합니다.

+0

그게 내가 찾고 있었던거야! Linq !!! ... 그리고 Servy 물론 감사합니다 :) –

6

당신은 원본을 돌연변이 않고,리스트의 반전 복사본을 만드는 방법을 요구하고 있습니다.

LINQ는 작업을 수행 할 수 있습니다

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

두 가지 중 하나를 수행 할 수 있습니다. 어느 방법의 목록을 반전 꺼내 방법을 네 번 호출하기 전에 목록을 한 번 반전, 또는 수행을 반전하기 전에 목록의 사본을 취

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

그래서 당신은 원래 목록을 만지지 마세요 .

지금 바로 한 번이 아니라 네 번을 Reverse라고 부르기 때문에 첫 번째 방법을 권장합니다.

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()) { 

}