2010-03-12 86 views
9

我有一個嵌套的foreach集合的方法(迭代一組對象,然後查看每個對象的內部)。我在書中看到了一個很好的模式,使它更加優雅,但不記得/找到代碼示例。我怎麼能讓這個更整潔?重構嵌套的foreach語句

該代碼只是一個典型的嵌套foreach聲明,所以我沒有提供代碼示例。

+8

此言只是一個典型的評論,所以我還沒有提供一個發表評論! ;-) – 2010-03-12 15:25:34

+2

我想起了Eric Lippert關於持續到外部循環的討論:http://blogs.msdn.com/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx – Brian 2010-03-12 15:38:06

回答

5

顯而易見的解決辦法就是擊敗成的方法。

老:

void SubmitOrders() 
{ 
    var orders = GetOrders(); 
    foreach (Order o in orders) 
    { 
     foreach (OrderDetail d in o.Details) 
     { 
      // Blah... 
     } 
    } 
} 

新:

void SubmitOrders() 
{ 
    var orders = GetOrders() 
    foreach (Order o in orders) 
    { 
     SubmitOrder(o); 
    } 
} 

void SubmitOrder(Order order) 
{ 
    foreach (OrderDetail d in order.Details) 
    { 
     // Blah... 
    } 
} 

其他的答案在這裏似乎集中在LINQ中,我會同意,如果你的循環有沒有副作用(即你只是試圖從最內層的循環中提取一些信息),那麼你可以使用一個或兩個簡單的Linq語句重寫整個事物。如果涉及副作用,那麼只需按照經過時間檢驗的子程序操作即可。

+0

它與此類似(返回IEnumerable)。謝謝。 – dotnetdev 2010-03-12 17:22:12

11

你將必須更具體的瞭解你的意思是關於「更高雅」的東西,作爲IMO沒有什麼特別不雅約嵌套foreach。這就是說,在.NET 3.5及以上版本中的LINQ擴展方法可以提供幫助(特別是SelectMany)。

public class Foo 
{ 
    public List<string> Strings { get; set; } 
} 

... 

List<Foo> foos = new List<Foo>(); 

foreach(string str in foos.SelectMany(f => f.Strings)) 
{ 
    ... 
} 
0

你在想的是這樣的?

public class YourObject{ 
    public List<OtherObject> Others { get; set; } 
} 

public class OtherObject{ 
    public void DoIt(){} 
} 

var theList = new List<YourObject>(); 

theList.ForEach(yo => yo.Others.ForEach(oo => oo.DoIt())); 
+0

'ForEach'是'List '的一種方法,**不是** LINQ。 – 2010-03-12 15:27:32

+0

@Adam羅賓遜,你是對的... – 2010-03-12 15:28:26

+0

@Adam羅賓遜:雖然人們可以(很)容易寫的IEnumerable''的作品完全一樣它爲'名單'一個'ForEach'擴展方法。 – 2010-03-12 15:32:58

4

前:

foreach(Customer c in Customers) 
{ 
    foreach(Order o in c.Orders) 
    { 
    o.Dance(); 
    } 
} 

後:

foreach(Order o in Customers.SelectMany(c => c.Orders)) 
{ 
    o.Dance(); 
} 
0

它很難給出沒有任何上下文或代碼片段的答案。但是,Martin Fowler的對重構迴路一個很好的文章在其中可以發現here LINQ管道(欣賞這雖然是一個老問題,所以希望未來的讀者將受益!)。