2013-02-26 38 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 2016-11-23 11:33:22

回答

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()做了就地反向。這意味着它會更改您的原始列表。

所以,你會使用這樣的:

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

如果你不想改變你原來的列表中,你會打電話給Enumerable.Reverse明確:

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

原因無法在擴展方法語法中使用Enumerable.Reverse:擴展方法不會隱藏/覆蓋實例方法,並且List<T>恰好已經有一個Reverse方法。

+3

+1用於強調原始列表* *改變*,因此*在程序的不同部分保持反轉*。 – 2013-02-26 10:18:36

3

List<T>.Reverse不返回任何東西!

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

    } 

} 
3

List<T>.Reverse()就地相反,它不返回新的列表。它會更改您的單數列表。

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)) 
{ 
    // 
} 

這裏是相同DEMO使用Enumerable.Reverse<T>方法。

2

List.Reverse()是一個具有void簽名的方法。

你可以改變你的循環如下。

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