【问题标题】:Any() in a Chained Linq expression链式 Linq 表达式中的 Any()
【发布时间】:2016-06-25 02:43:08
【问题描述】:

以下是两个扩展方法。
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));

        }



    }

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    回答您的问题:

    首先,它们根本不一样,第一个是检查列表是否包含字符串作为元素,而第二个检查每个元素是否包含字符串。

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

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

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

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

    【讨论】:

    • 是的,我把两者的逻辑区别放在一起,
    • 是的,我得到了两者之间的逻辑差异,但在 Linq 表达式中 Any() 返回布尔值,完美。但是在 Any 表达式中有 source.Contains(item) 我理解的是查看序列中的每个项目并将其与“源”字符串进行检查。如果这些 source.Contains(item) 计算中的 Any() 返回 true,则 Any 方法将向函数返回 true。对吗?
    【解决方案2】:

    它们是两个不同的功能:

            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) 所做的是,引用文档,“返回一个值,指示指定的子字符串是否出现在此字符串中。” 在这种情况下,它检查 source 是否包含子字符串 item .

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

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

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

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

            return stringsToMatch.Any(source.Contains);
    

    要查看这两种方法的定义,请在 Visual Studio 中右键单击它们并选择“转到定义”或“查看定义”。这将带您了解它们的定义和 cmets。

    要自己查看差异,请尝试使用source 不在stringstoMatch 中但stringsToMatch 中的一些字符串是source 的子字符串的数据集。您会立即看到差异。例如:"abc""xyzabcdef" 的子字符串。

    编辑:这里我在 C# 交互中尝试过:

    > var list = new List<string> { "abc", "def", "xyz" };
    > var x = "abcd";
    > x.ContainsAny(list)
    false
    > x._ContainsAny(list)
    true
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2021-08-27
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多