2010-02-12 53 views
7

有誰知道是否可以退出使用lambda的泛型ForEach?例如c#exit generic ForEach使用lambda

someList.ForEach(sl => 
    { 
    if (sl.ToString() == "foo") 
     break; 

    // continue processing sl here 
    // some processing code 
    } 
); 

該代碼本身不會編譯。我知道我可以使用普通的foreach,但爲了一致性,我想使用lambda。

非常感謝。

+0

有沒有必要這樣做的原因?我一直對「休息」保持警惕。在開關櫃外面,我從來沒有見過需要使用它們。 – FrustratedWithFormsDesigner 2010-02-12 03:09:04

+5

我使用'break'和'continue'很多。有時候你只是不希望循環體執行完畢,'break' /'continue'簡化了代碼。 – 2010-02-12 03:12:18

+0

是否有任何理由爲此更喜歡Lambda表達式? – 2010-02-12 03:19:00

回答

17

當然。但首先請注意,我建議不要這樣做;我說序列操作符不應該有副作用,並且聲明應該有副作用。如果你在ForEach lambda中做了一些事情,那麼將它作爲foreach循環體中的一個聲明,而不是讓它看起來像一個序列操作符。

這就是說,這就是你所做的。首先,你自己寫的是任意序列的作品一個foreach,而不是僅僅列出:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) 
{ 
    foreach(var item in sequence) action(item); 
} 

現在你寫你的休息是這樣的:

someList 
    .TakeWhile(x=>x.ToString() != "foo") 
    .ForEach(sl=> 
    {/*your action here*/}); 
+0

Bart De Smet做了幾個ForEach類型的東西,以if開頭:http://community.bartdesmet.net/blogs/bart/archive/2009/07/11/bart-s-control-library-not-什麼,你認爲,這 - 是 - 部分 - 0.aspx。 – 2010-02-12 04:41:21

7

MSDN

以下規則適用於lambda表達式中的變量 範圍:

snip

lambda表達式不能包含 goto語句,break語句或 繼續其目標是 體外或在 的身體包含匿名函數聲明。

不知道這是否有助於您發佈的代碼。相關的引用來自MSDN文章的末尾。

+0

最相關和完整的答覆呢。我喜歡! – 2010-02-12 03:20:58

1

警告:下面的代碼不會被認真對待,僅用於娛樂目的!

可以「模擬」一個繼續早日迴歸這樣的:

Enumerable.Range(1, 20) 
      .ForEach(n => 
       { 
        if (n == 10) return; 
        Console.WriteLine("This is not 10: {0}", n); 
       }); 

這麼說,我覺得內拉姆達的是副作用是,你這樣做是錯誤的標誌。改用適當的foreach。或者像TakeWhile那樣的東西,Eric已經表示過了。

0

這個怎麼樣?

 Enumerable.Range(1, 10) 
     .Where(x => x % 2 != 0) 
     .ToList() 
     .ForEach(x => Console.WriteLine(x));