2013-02-26 10 views
9

ich ein Problem habe, ich kann die folgende List umkehren:Wie kann ich eine Liste in foreach umkehren?

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

ich den Fehler immer erhalten:

Type void is not enumerable

Was ist das Problem und wie es zu lösen?

+0

Nach diesem Beitrag, wie es scheint sie die Unterschrift der Reverse-Methode in einer aktuellen Version von .NET geändert hat: public static IEnumerable umge (diese IEnumerable Quelle); – hbulens

Antwort

32

List<T>.Reverse nicht zurückgeben alles - es kehrt die Liste an Ort und Stelle.

Wenn Sie die LINQ version of Reverse verwenden möchten, die eine umgekehrte Sequenz kehrt aber ohne die bestehende Liste mutieren, könnten Sie verwenden:

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

Oder vielleicht deutlicher:

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 Reihenfolge innerhalb der Liste ändern - es gibt keine neue Liste mit umgekehrter Reihenfolge der Elemente zurück.

16

List<T>.Reverse() ist ein in-place umgekehrt. Das bedeutet, dass es Ihre ursprüngliche Liste ändert.

Also, würden Sie es wie folgt verwenden:

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

Wenn Sie wollen nicht Ihre ursprüngliche Liste ändern, werden Sie Enumerable.Reverse ausdrücklich nennen sind:

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

Der Grund für Enumerable.Reverse in der Syntax der Erweiterungsmethode nicht verwenden zu können, ist Folgendes: Die Erweiterungsmethoden unterdrücken die Methoden der Instanz nicht und List<T> hat bereits eine Methode Reverse.

+3

+1 für die Hervorhebung der ursprünglichen Liste ist * geändert * und daher * ist und bleibt umgekehrt * an verschiedenen Stellen des Programms. –

3

List<T>.Reverse gib nichts zurück!

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

    } 

} 
3

List<T>.Reverse() ist ein in-place Rückwärts, ist es nicht eine neue Liste zurückgibt. Es ändert Ihre orinal Liste.

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

Sie benötigen row.Reverse(); in Ihrer ersten foreach-Anweisung zu verwenden. Mögen;

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

Hier ist ein DEMO.

Wenn Sie Ihre orininal Liste nicht ändern möchten, können Sie Enumerable.Reverse Methode statt verwenden.

Inverts the order of the elements in a sequence.

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

Hier ist die gleiche DEMO mit Enumerable.Reverse<T> Methode.

2

List.Reverse() ist eine Methode mit einer ungültigen Signatur.

Sie können wahrscheinlich Ihre Schleife wie folgt ändern.

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