2016-06-14 519 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 
}