我的linq查询得到了一个非常奇怪的结果,我不明白:
public class Person
{
public Address Address { get; set; }
public string Name { get; set; }
...
}
想象一下,我有ICollection<Person>
一个条目且该人有一个地址null
当我执行以下linq语句时:
var test = person.Select(x => x.Address).ToList();
test
变量是一个包含1个条目的列表null
。
null
条目而不是空列表?提前致谢
答案 0 :(得分:4)
为什么我确实得到一个空条目而不是一个空列表?
因为 1-Banana
2-Mango
3-Apple
4-Oranges
5-Grapes
并且它只会给出地址的结果,所以null
来自MSDN
Select is a projection
我需要更改什么才能获得空列表?
Projects each element of a sequence into a new form.
或 var test = person.Where(x => x.Address != null).Select(x => x.Address).ToList();
LINQ Query Expression
答案 1 :(得分:3)
添加where
语句以限制结果,使其仅包含地址不为空的人员:
var test = person.Where(x => x.Address != null).Select(x => x.Address).ToList();
如果您不这样做,您的结果不会被过滤,您只需返回集合中所有元素的投影。
答案 2 :(得分:1)
LINQ只是一组专门的迭代。
在一天结束时,您对Select
扩展程序的调用是这样的:
foreach(Person person in persons)
{
// This is equivalent to person => person.Address
yield return person.Address;
}
...这就是为什么你得到一个字符串的集合,其中有一个null
temtem。
另一方面,如果你想过滤序列,这样你就不会得到带有null
引用的集合,没有LINQ你会怎么做?也许是这样的:
foreach(Person person in persons)
{
if(person.Address != null)
yield return person.Address;
}
...在LINQ世界中,这是Where
,然后是Select
:
persons.Where(person => person.Address != null).Select(person => person.Address);