C# 这两个linq表达式在功能上等效吗?

C# 这两个linq表达式在功能上等效吗?,c#,linq,C#,Linq,以下各项之间是否存在功能差异: if (photos.Any(it => it.Archived)) 及 如果是这样,是否有更令人信服的理由使用一种方法而不是另一种方法?否,对于当前.NET Framework实现的方法来说,没有实际差异。由于延迟执行,两者都将枚举照片,直到找到匹配项,然后停止。(前提是这是Linq到对象-其他提供程序的行为可能不同) 如果你想吹毛求疵,在实现上有一些小的差别。(您可以在框架源代码中查找): Any使用foreach简单地迭代集合,其中aswhere返回

以下各项之间是否存在功能差异:

if (photos.Any(it => it.Archived))


如果是这样,是否有更令人信服的理由使用一种方法而不是另一种方法?

否,对于当前.NET Framework实现的方法来说,没有实际差异。由于延迟执行,两者都将枚举照片,直到找到匹配项,然后停止。(前提是这是Linq到对象-其他提供程序的行为可能不同)

如果你想吹毛求疵,在实现上有一些小的差别。(您可以在框架源代码中查找):

Any
使用foreach简单地迭代集合,其中as
where
返回
whererrayiterator
WhereListIterator
,或
WhereEnumerableIterator
,具体取决于传入的集合类型。我还没有深入研究这个问题,但我想这样做是为了在使用数组或列表的情况下允许链式扩展方法进行优化

换句话说,其中
Any
包含一个简单的
foreach
其中
执行以下操作:

    if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); 
    if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
    return new WhereEnumerableIterator<TSource>(source, predicate);
if(source是TSource[])返回新的whererrayiterator((TSource[])源,谓词);
if(source是List)返回新的WhereListIterator((List)source,谓词);
返回新的WhereEnumerableIterator(源,谓词);

从功能上讲,它们做同样的事情。性能取决于特定的提供程序,但例如,在LINQ to SQL中,两种形式都生成完全相同的SQL:

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [dbo].[photos] AS [t0]
            WHERE [t0].[Archived] = 1
            ) THEN 1
        ELSE 0
     END) AS [value]

如果我必须选择一个,我会使用第一个选项,因为它对我来说更清晰。

作为一个表达式,它们产生相同的结果。然而,产生这种结果的机制略有不同。但请注意,它们都从原始序列中遍历相同数量的项


我会一直使用前者,因为前者较短,而且在选择前者时不会丢失清晰度、可读性和可维护性

结果应该是一样的,但由于我不能100%确定是否存在任何性能差异,所以我将放弃这一点,让对此帖子有明确答案的人来回答。在Visual Studio中,您可以自己调查IL。请在funktion+1中设置一个断点,以提示实际的实现取决于提供程序。@Tim Jarvis:谢谢。我只是从一个“提示”重新编写了它,使它更明确一点,即它是特定于提供程序的。我认为,如果给定一个null谓词,any会抛出ArgumentNullException,就像在第二个版本中一样,但我不太使用LINQ。问题不是延迟执行,而是延迟计算。是的,有区别。
SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [dbo].[photos] AS [t0]
            WHERE [t0].[Archived] = 1
            ) THEN 1
        ELSE 0
     END) AS [value]