当结果为空时LINQ返回什么

我有一个关于LINQ查询的问题。通常,查询返回IEnumerable<T>类型。如果返回值为空,不确定是否为空。我不确定如果在IEnumerable结果中没有发现,下面的ToList()是否会抛出异常或只是一个空的List<string> ?

   List<string> list = {"a"};
// is the result null or something else?
IEnumerable<string> ilist = from x in list where x == "ABC" select x;
// Or directly to a list, exception thrown?
List<string> list1 = (from x in list where x == "ABC" select x).ToList();

我知道这是一个非常简单的问题,但是我暂时没有VS可用。

237027 次浏览

它将返回一个空的枚举对象。它不是空的。你可以睡觉的声音:)

. tolist返回一个空列表。(与new List<T>()相同);

它不会抛出异常,你会得到一个空列表。

var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );


(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Dump来自LinqPad)

这里的其他帖子已经明确表示,结果是一个“空”;IQueryable,而ToList()将正确地将其更改为空列表等等。

一定要小心一些操作符,因为如果你给它们发送一个空的枚举对象,它们就会抛出。当你把它们串在一起时就会发生这种情况。

在Linq-to-SQL中,如果你试图获得查询的第一个元素而没有结果,你会得到sequence contains no elements错误。我可以向你保证,提到的错误不等于object reference not set to an instance of an object。 结论是no,它不会返回null,因为null不能说sequence contains no elements,它总是说object reference not set to an instance of an object;)

你也可以检查.Any()方法:

if (!YourResult.Any())

只是注意.Any仍然会从数据库中检索记录;执行.FirstOrDefault()/.Where()将会有同样多的开销,但是你将能够捕获从查询返回的对象