我有if語句是這樣的:C# - 使用lambda表達式的輸入參數if語句
if (myList.Any(x => s.Contains(x))
{
//some code here
}
中,我檢查是否存在被包含在一個字符串s在myList中的字符串。 是否有可能獲得這個列表的元素x,並在條件滿足時在上面顯示的if語句(在「// some code here」部分)中使用它?
謝謝。
我有if語句是這樣的:C# - 使用lambda表達式的輸入參數if語句
if (myList.Any(x => s.Contains(x))
{
//some code here
}
中,我檢查是否存在被包含在一個字符串s在myList中的字符串。 是否有可能獲得這個列表的元素x,並在條件滿足時在上面顯示的if語句(在「// some code here」部分)中使用它?
謝謝。
從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
第一。
我不知道爲什麼,但是當我使用FirstOrDefault時,你已經建議,它只在s等於x時才起作用。例如,如果s =「email」,x =「email」,它可以工作,但當s =「emailaaa」和x =「email」時不起作用。 – adamm
我會仔細檢查一下's'和'x'是你期望它們在調試器內部。如果你切換到'myList.Any(x => {var found = s.Contains(x); return found;});'你可以在返回中放置一個斷點並查看's','x'的值和「發現」。 –
我發現問題所在。你的解決方案是OK的...我的代碼中有一些東西導致了這種行爲(它與主題無關,所以我不會解釋是什麼問題)。 – adamm
我會用這個foreach
/Where()
,即使我只期待0或1的結果:
foreach (var item in myList.Where(x => s.Contains(x)))
{
//some code here
}
將'myList'包含'null'永遠不會消失? –
不,它不包含null – adamm