请考虑以下代码:
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;
}
}
此代码运行顺利。 result1
为null
,而result2为空List<Foo>
。
如果collection包含元素,则会抛出异常,如预期的那样。所以我想,如果集合没有元素,那么表达式就不会被评估。
在FirstOrDefault
的情况下,它是可以接受的,因为无论如何都应该处理null返回,但是在查询多个元素的情况下,我发现这种行为令人困惑,因为我可能不知道集合中有哪些元素,如果有任何,并且错误地传递了lambda中的一个单元化对象,但是得到了一些正确的&#34;正确的&#34;结果即空List<Foo>
当集合是emty时,是否可以评估linq表达式,以防止出现意外结果并获得异常?
答案 0 :(得分:3)
Where
的谓词被称为,用于集合中的每个元素(如果整个结果集被迭代)。所以Where
绝对是在空集合上执行的,它只是不调用谓词。它会在集合中所有零项上调用它。
当然,通过在空集合上调用它,无法对无法实际工作的谓词进行充分测试。要测试谓词是否正常工作,您需要至少有一些测试在谓词的序列中包含实际项目。