我有一个嵌套的foreach
集合的方法(迭代一组对象,然后查看每个对象的内部)。我在书中看到了一个很好的模式,使它更加优雅,但不记得/找到代码示例。我怎么能让这个更整洁?重构嵌套的foreach语句
该代码只是一个典型的嵌套foreach
声明,所以我没有提供代码示例。
我有一个嵌套的foreach
集合的方法(迭代一组对象,然后查看每个对象的内部)。我在书中看到了一个很好的模式,使它更加优雅,但不记得/找到代码示例。我怎么能让这个更整洁?重构嵌套的foreach语句
该代码只是一个典型的嵌套foreach
声明,所以我没有提供代码示例。
显而易见的解决办法就是击败成的方法。
老:
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语句重写整个事物。如果涉及副作用,那么只需按照经过时间检验的子程序操作即可。
它与此类似(返回IEnumerable)。谢谢。 – dotnetdev 2010-03-12 17:22:12
你将必须更具体的了解你的意思是关于“更高雅”的东西,作为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))
{
...
}
你可以使用LINQ运营商的SelectMany:
foreach (var bar in model.FooCollection.SelectMany(f => f.Bars))
{
// Do Stuff
}
你在想的是这样的?
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()));
'ForEach'是'List
@Adam罗宾逊,你是对的... – 2010-03-12 15:28:26
@Adam罗宾逊:虽然人们可以(很)容易写的IEnumerable''
前:
foreach(Customer c in Customers)
{
foreach(Order o in c.Orders)
{
o.Dance();
}
}
后:
foreach(Order o in Customers.SelectMany(c => c.Orders))
{
o.Dance();
}
它很难给出没有任何上下文或代码片段的答案。但是,Martin Fowler的对重构回路一个很好的文章在其中可以发现here LINQ管道(欣赏这虽然是一个老问题,所以希望未来的读者将受益!)。
此言只是一个典型的评论,所以我还没有提供一个发表评论! ;-) – 2010-03-12 15:25:34
我想起了Eric Lippert关于持续到外部循环的讨论:http://blogs.msdn.com/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx – Brian 2010-03-12 15:38:06