我有一個嵌套的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