在空集合上调用时,不评估Linq表达式

时间:2015-10-16 23:44:14

标签: c# linq

请考虑以下代码:

class Program
{
    public static ObservableCollection<Foo> collection = new ObservableCollection<Foo>();
    static void Main(string[] args)
    {
        Foo bar = null;
        var result1 = collection.Where(b => b.id == bar.id).FirstOrDefault();
        var result2 = collection.Where(c => c.id == bar.id).ToList();
    }
    public class Foo
    {
        public string id;
    }
}

此代码运行顺利。 result1null,而result2为空List<Foo>

如果collection包含元素,则会抛出异常,如预期的那样。所以我想,如果集合没有元素,那么表达式就不会被评估。

FirstOrDefault的情况下,它是可以接受的,因为无论如何都应该处理null返回,但是在查询多个元素的情况下,我发现这种行为令人困惑,因为我可能不知道集合中有哪些元素,如果有任何,并且错误地传递了lambda中的一个单元化对象,但是得到了一些正确的&#34;正确的&#34;结果即空List<Foo>

当集合是emty时,是否可以评估linq表达式,以防止出现意外结果并获得异常?

1 个答案:

答案 0 :(得分:3)

Where的谓词被称为,用于集合中的每个元素(如果整个结果集被迭代)。所以Where绝对是在空集合上执行的,它只是不调用谓词。它会在集合中所有零项上调用它。

当然,通过在空集合上调用它,无法对无法实际工作的谓词进行充分测试。要测试谓词是否正常工作,您需要至少有一些测试在谓词的序列中包含实际项目。