c# - 在if语句

时间:2016-06-14 21:50:13

标签: c# lambda

我有这样的声明:

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

我在其中检查myList中是否包含字符串s中的字符串。 是否有可能获得此列表的元素x并在满足条件时在上面显示的if语句中使用它(在“// some some here”部分中)?

谢谢。

2 个答案:

答案 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
}