我有这样的声明:
if (myList.Any(x => s.Contains(x))
{
//some code here
}
我在其中检查myList中是否包含字符串s中的字符串。 是否有可能获得此列表的元素x并在满足条件时在上面显示的if语句中使用它(在“// some some here”部分中)?
谢谢。
答案 0 :(得分: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
与默认结果之间的区别。
以上两种方法仅对Contains
匹配的列表中的第一项起作用,如果您想对所有项目采取行动,请使用Where(
子句和foreach
foreach(var item in myList.Where(x => s.Contains(x))
{
//some code here
}
您必须承诺不会使用以下代码并首先使用其他选项
您也可以执行您所陈述的问题,可以将一个变量分配给lambada内部。但是,这不能用表达式lambadas完成,只能使用语句lambadas。
string matachedString = null;
if (myList.Any(x => { var found = s.Contains(x);
if(found)
matachedString = x;
return found;
});
{
//some code here
}
但只能将此选项作为最后的手段,使用其中一种更合适的方法,例如FirstOrDefaut
,或首先编写自定义方法,例如TryFirst
。
答案 1 :(得分:1)
即使我只期望0或1结果,我也会使用foreach
/ Where()
:
foreach (var item in myList.Where(x => s.Contains(x)))
{
//some code here
}