我有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