2015-10-27 85 views
0

我對Linq很新。我想將這些代碼行轉換爲linq lambda表達式,如果有道理,我該如何實現?我該如何將這個foreach循環轉換爲linq?

foreach (var Type in Essay.Text) 
{ 
    string text = 
      $"{"here is result"}\n{method(Type)}"; 
    if (text.Length <= 20 && !string.IsNullOrEmpty(method(Type))) 
    { 
      Essay.Total += text; 
    } 
} 
+1

,則不應使用「Type」的名稱,因爲它已經存在於C#中。你的對象應該被命名爲別的東西。 – Greg

+0

恕我直言,你應該通過替換字符串連接'Essay.Total + =文本開始;由一個StringBuilder'。 – Filburt

+0

好吧,謝謝你的建議 – someone

回答

2

隨着Resharper幫助:

Essay.Total = string.Concat(
      Essay.Text.Select(Type => new {Type, text = $"{"here is result"}\n{method(Type)}"}) 
       .Where(@t => @t.text.Length <= 20 && !string.IsNullOrEmpty(method(@t.Type))) 
       .Select(@t => @t.text) 
      ); 
+2

您可以通過一個'string.Concat' –

+0

@KooKiz真的,不知道 – Backs

+0

感謝您的響應,重載方法,當我想幫助ReSharper的,將其轉換爲LINQ但它不能代替'string.Join' lambda表達式,有沒有什麼辦法將它轉換爲lambda在resharper設置? – someone

2

事情是這樣的:

foreach (var type in from type in Essay.Text 
     let text = $"{"here is result"}\n{method(Type)}" 
     where text.Length <= 20 && !string.IsNullOrEmpty(method(Type)) select type) 
{ 
    Essay.Total += type; 
} 
+1

需要更多換行符... – Servy

0

幾個要點:

  • 沒有理由調用方法兩次,j烏斯季緩存它通過使用
  • 您還可以構建最終的字符串

這應該爲你做這項工作前檢查文本的長度:

var texts = from type in essay.Text 
      let methodResult = method(type) 
      where !string.IsNullOrEmpty(methodResult) 
      let text = $"here is result\n{methodResult}" 
      where text.Length <= 20 
      select text; 

essay.Total += string.Concat(texts); 
相關問題