2010-03-12 61 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管道(欣赏这虽然是一个老问题,所以希望未来的读者将受益!)。