LINQ中的Contains和Any有什么区别?

44

在LINQ中,ContainsAny有什么区别?


4
不确定为什么会被踩,这是一个完全合理的问题。 - user2202911
1
我认为这个问题已经在这里得到了回答:https://dev59.com/qm855IYBdhLWcg3wQx9L - msmolcic
1
文档位于 http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx - Tim S.
2
@Joce 这个问题是这样的...我找不到那个页面。所以才问的。 - user2202911
2
因为你的SEO技能很棒,所以给你点个赞。 - sean
显示剩余3条评论
5个回答

66
< p > < code > Contains 接受一个对象,< code > Any 接受一个谓词。 < /p > < p > 使用 < code > Contains 的方式如下: < /p >
listOFInts.Contains(1);

Any这样的任何内容:

listOfInts.Any(i => i == 1);
listOfInts.Any(i => i % 2 == 0); // Check if any element is an Even Number

因此,如果您想检查特定条件,请使用Any。如果您想检查元素的存在,请使用Contains

Contains的MSDN文档,Any的MSDN文档。


从技术上讲,Contains使用TSource,它是一个StructObject,具体取决于集合的定义方式... - JJS
1
@JJS 我的意思是“对象”在一般的“C#中的所有东西都是对象”的意义上。也就是说,它可以是一个int、一个string、一些结构体或者一个MyClass。当然,你是正确的。 - BradleyDotNET

16

Contains检查序列是否包含指定的元素。

Enumerable.Any检查序列中的任意一个元素是否满足条件。

考虑以下示例:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };
bool contains = list.Contains(1); //true

bool condition = list.Any(r => r > 2 && r < 5);

7

Contains 关注源集合是否为 ICollectionAny 则不关心。

Enumerable.Contains http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#f60bab4c5e27a849

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)
{
    ICollection<TSource> collection = source as ICollection<TSource>;
    if (collection != null)
    {
        return collection.Contains(value);
    }
    return source.Contains<TSource>(value, null);
}

Enumerable.Any http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#6a1af7c3d17845e3

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    foreach (TSource local in source)
    {
        if (predicate(local))
        {
            return true;
        }
    }
    return false;
}

这不是唯一的区别,但这是我不知道的一个! - BradleyDotNET

2

此处所述,另一个不同之处在于性能方面

  • Contains 对于List是O(n),对于HashSet是O(1)
  • Any 简单地是O(n)

1
正确,但这个问题是关于扩展方法 Enumerable.Contains<T>,而不是接口方法 ICollection<T>.Contains - Theodor Zoulias

0

包含

使用默认的相等比较器确定序列是否包含指定的元素。

任何

确定序列是否包含任何元素。

关于文档:

似乎找不到任何关于它的文档。

所有(大多数?)LINQ扩展方法:这里


这是 Any 的一个重载(也是较少使用的一个)。我建议在你的回答中至少包含更常用的重载。 - BradleyDotNET
我的答案已经包括了所有的重载 ;) (以及所有(大多数?)其他LINQ扩展方法) - RobIII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接