2016-06-14 67 views
0

我有if語句是這樣的:C# - 使用lambda表達式的輸入參數if語句

if (myList.Any(x => s.Contains(x)) 
{ 
//some code here 
} 

中,我檢查是否存在被包含在一個字符串s在myList中的字符串。 是否有可能獲得這個列表的元素x,並在條件滿足時在上面顯示的if語句(在「// some code here」部分)中使用它?

謝謝。

+0

將'myList'包含'null'永遠不會消失? –

+0

不,它不包含null – adamm

回答

4

Any切換到FirstOrDefault,將返回與測試相匹配的項目,如果沒有項目匹配,則返回null。

var found = myList.FirstOrDefault(x => s.Contains(x)); 
if (found != null) 
{ 
//some code here 
} 

如果null可以考慮在myList「有效價值」的元素,你可以創建一個擴展方法TryFirst

public static class ExtensionMethods 
{ 
    public static bool TryFirst<T>(this IEnumerable<T> @this, Func<T, bool> predicate, out T result) 
    { 
     foreach (var item in @this) 
     { 
      if (predicate(item)) 
      { 
       result = item; 
       return true; 
      } 
     } 
     result = default(T); 
     return false; 
    } 
} 

這將讓你做

string foundString; 
var wasFound = myList.TryFirst(x => s.Contains(x), out foundString); 
if (wasFound) 
{ 
//some code here 
} 

,並告訴列表中的null與默認結果之間的差異。

,如果你想採取行動的所有項目使用Where(條款以上兩種方法只作用於名單上的第一個項目,該Contains將匹配和foreach

foreach(var item in myList.Where(x => s.Contains(x)) 
{ 
//some code here 
} 

您必須承諾您不會使用以下代碼並首先使用其他選項之一

你也可以做你陳述的問題,它可以得到一個變量分配到lambada內。然而,這不能用表達式lambda來完成,只能用lambda表達式來完成。

string matachedString = null; 
if (myList.Any(x => { var found = s.Contains(x); 
         if(found) 
          matachedString = x; 
         return found; 
        }); 
{ 
//some code here 
} 

但只做這個選項作爲最後的手段,使用像FirstOrDefaut更合適的方法之一或編寫自定義的方法一樣TryFirst第一。

+0

我不知道爲什麼,但是當我使用FirstOrDefault時,你已經建議,它只在s等於x時才起作用。例如,如果s =「email」,x =「email」,它可以工作,但當s =「emailaaa」和x =「email」時不起作用。 – adamm

+0

我會仔細檢查一下's'和'x'是你期望它們在調試器內部。如果你切換到'myList.Any(x => {var found = s.Contains(x); return found;});'你可以在返回中放置一個斷點並查看's','x'的值和「發現」。 –

+0

我發現問題所在。你的解決方案是OK的...我的代碼中有一些東西導致了這種行爲(它與主題無關,所以我不會解釋是什麼問題)。 – adamm

1

我會用這個foreach/Where(),即使我只期待0或1的結果:

foreach (var item in myList.Where(x => s.Contains(x))) 
{ 
    //some code here 
}