2013-02-26 2 views
9
나는 문제가

, 나는 역 은어 List 다음어떻게 foreach에서 목록을 뒤집을 수 있습니까?

foreach (List<Foo> row in Items) 
{ 
    foreach (Foo item in row.Reverse()) 
    { 
     ... 
    } 
} 

난 항상 오류 얻을 : 무슨 문제와 그 해결 방법에

Type void is not enumerable

를?

+0

이 게시물에 따르면, 그들이 .NET의 최신 버전에 역방향 방법의 서명을 변경 한 것 : 공공 정적는 IEnumerable (이 IEnumerable을 소스); – hbulens

답변

32

List<T>.Reverse돌아 가기 무엇이든 - 그것은 목록의 위치를 ​​바꿉니다. 기존 목록을 돌연변이없이 반대의 순서를 반환 LINQ version of Reverse하지만 를 사용하려면

, 당신은 사용할 수 있습니다 아마도 더 명확하게

foreach (IEnumerable<Foo> row in Items) 
{ 
    foreach (Foo item in row.Reverse()) 
    { 
     ... 
    } 
} 

또는를 :

foreach (List<Foo> row in Items) 
{ 
    // We want to use the LINQ to Objects non-invasive 
    // Reverse method, not List<T>.Reverse 
    foreach (Foo item in Enumerable.Reverse(row)) 
    { 
     ... 
    } 
} 
4
foreach (List<Foo> row in Items) 
{ 
    row.Reverse() 
    foreach (Foo item in row) 
    { 
     ... 
    } 
} 

Reverse 목록 내의 순서 변경 - 항목의 순서가 반대 인 새 목록을 반환하지 않습니다.

16

List<T>.Reverse()입니다. 내부는입니다. 즉 원래 목록이 변경됩니다. 명시 적으로 Enumerable.Reverse를 호출하면 원래 목록을 변경하지 않으려면

foreach (List<Foo> row in Items) 
{ 
    row.Reverse(); 
    foreach (Foo item in row) 
    { 
     ... 
    } 
} 

, 당신은 것이다 :

그래서, 당신은 다음과 같이 사용할 것

foreach (List<Foo> row in Items) 
{ 
    foreach (Foo item in Enumerable.Reverse(row)) 
    { 
     ... 
    } 
} 

이유를 들어 확장 메서드 구문에서 Enumerable.Reverse을 사용할 수 없으면 확장 메서드는 인스턴스 메서드를 숨기거나 재정의하지 않으며 List<T>에는 이미 Reverse 메서드가 있습니다.

+3

원래 목록을 강조하기 위해 +1이 * 변경 *되어 있으므로 프로그램의 다른 부분에서 * 역전되어 있습니다. –

3

List<T>.Reverse 모두를 반환하지 않습니다!

foreach (IEnumerable<Foo> row in Items) 
{ 
    row.Reverse(); 
    foreach(Foo item in row) 
    { 

    } 

} 
3

List<T>.Reverse()는이 자리에서 역, 그것은 새 목록을 반환하지 않습니다이다. orininal 목록이 변경됩니다.

Reverses the order of the elements in the entire List<T> .

첫 번째 foreach 문에는 row.Reverse();을 사용해야합니다. 처럼; 여기

foreach (List<Foo> row in Items) 
{ 
    row.Reverse(); 
    foreach (Foo item in row) 
    { 
     // 
    } 
} 

DEMO입니다. 당신이 당신의 orininal 목록을 변경하지 않으려면

대신의 Enumerable.Reverse 방법을 사용할 수 있습니다.

Inverts the order of the elements in a sequence.

foreach (Foo item in Enumerable.Reverse(row)) 
{ 
    // 
} 

여기 Enumerable.Reverse<T> 방법을 이용하여 동일한 DEMO이다.

2

List.Reverse()는 void 서명이있는 메소드입니다.

다음과 같이 루프를 변경할 수 있습니다.

foreach (List<Foo> row in Items) 
{ 
    row.Reverse(); 
    foreach (Foo item in row) 
    { 
     ... 
    } 
} 
관련 문제