链式Linq表达式中的Any()

时间:2016-06-25 02:43:09

标签: c# linq

以下是两种扩展方法    ContainsAny()将检查IEnumerable中的任何字符串元素是否包含调用该方法的字符串。好的,没问题

_ContainsAny()使用链式Linq表达式来检查IEnumerable中是否包含任何字符串元素。

1)第一个问题是,结果是否存在差异,它可以产生以下两种不同类型的逻辑。我得到了相同的结果。

2)第二个问题是,Chain Linq表达如何在这里工作? return stringsToMatch.Any(item => source.Contains(item)); Contains()为Any()方法返回一个布尔值? Any()和Contains()方法在此链式表达式中如何协同工作?

 public static class ContainsAnyExtension
    {



        public static bool ContainsAny(this string source, IEnumerable<string> stringsToMatch)
        {
            return stringsToMatch.Contains(source);

        }



       public static bool _ContainsAny(this string source, IEnumerable<string> stringsToMatch)
        {
            return stringsToMatch.Any(item => source.Contains(item));

        }



    }

2 个答案:

答案 0 :(得分:1)

回答你的问题:

首先,它们根本不相同,第一个是检查列表是否将字符串作为元素,而第二个检查每个元素是否有字符串作为其一部分。

  

1)第一个问题是,结果是否存在差异   它可以产生以下两种不同类型的逻辑。我明白了   相同的结果。

是的,只有当列表包含元素时才会返回第一个(true / false) 如果任何元素具有cotnained IN IT字符串,则第二个将返回。

  

2)第二个问题是,Chain Linq表达式如何工作   这里? return stringsToMatch.Any(item =&gt; source.Contains(item));   Contains()为Any()方法返回一个布尔值?到底是怎么回事   Any()和Contains()方法在此链中一起工作   表达

这不是链表达式,它只是一个布尔函数作为扩展添加。

答案 1 :(得分:0)

它们是两个不同的功能:

        public static bool ContainsAny(this string source, IEnumerable<string> stringsToMatch)
        {
            return stringsToMatch.Contains(source);   
        }

第一个是LINQ中定义的扩展方法。它会检查列表stringsToMatch以查看其中一个字符串是否等于您的source。就像在,它将字符串与字符串一对一地进行比较。

        public static bool _ContainsAny(this string source, IEnumerable<string> stringsToMatch)
        {
            return stringsToMatch.Any(item => source.Contains(item));  
        }

第二个是string的实例方法。 source.Contains(item)的作用是,引用文档,&#34;返回一个值,指示指定的子字符串是否出现在此字符串中。&#34; 在这种情况下,它检查{是否{ {1}}包含子字符串source

item的作用是返回Any()true,无论枚举中的任何项是否为所提供的lambda函数返回false。您可以定义一个匿名方法,而不是放置Lambda函数,它的工作原理相同:

true

您可能会看到为什么使用lambda函数。它只是看起来更好。

编辑:我在Visual Studio中玩它,显然这也是有效的代码。哈!!我不知道它是否会起作用。

        return stringsToMatch.Any(delegate (string item) { return source.Contains(item); });

要查看这两种方法的定义,请在Visual Studio中右键单击它们,然后选择&#34;转到定义&#34;或者&#34; Peek定义&#34;。这将带您进入两者的定义和评论。

要自己查看差异,请尝试使用 return stringsToMatch.Any(source.Contains); source不在stringstoMatch的数据集,但stringsToMatch中的某些字符串是{{1}的子字符串}}。你马上就会看到这种差异。例如:source"abc"的子字符串。

编辑:我在C#interactive中试过它:

"xyzabcdef"

您现在可以看到两种方法之间的区别。