关于c#:当结果为空时,LINQ返回什么

What does LINQ return when the results are empty

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

1
2
3
4
5
   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();

我知道这是一个非常简单的问题,但我暂时没有虚拟机。


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


您还可以检查.Any()方法:

1
if (!YourResult.Any())

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


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

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

(转储来自LinqPad)


.ToList返回空列表。(与new list()相同);


在linq to sql中,如果您试图获取查询的第一个元素,但没有结果,则会得到sequence contains no elements错误。我可以向你保证,上述误差不等于object reference not set to an instance of an object。总之,不,它不会返回空,因为空不能表示sequence contains no elements,它总是表示object reference not set to an instance of an object


这里的其他文章已经清楚地表明,结果是一个"空"的iQueryable,to list()将正确地更改为空列表等。

一定要小心一些运算符,因为如果您向它们发送一个空的可枚举值,它们将抛出。当你把它们连在一起时,就会发生这种情况。


它不会引发异常,您将得到一个空列表。