我的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
变量是一个列表,有一个条目是null
。
- 为什么我得到一个
null
条目而不是空列表? - 我需要改变什么才能得到一个空列表?
Thanks in advance
为什么我得到一个空条目而不是空列表?
因为Select is a projection
它只会给出地址的结果所以是null
From MSDN
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
var t = from p in person
where p.Adresse != null
select p.Adresse;
添加where
语句来限制结果,使其只包含地址不为空的人员:
var test = person.Where(x => x.Address != null).Select(x => x.Address).ToList();
如果您不这样做,您的结果不会被过滤,您只是返回集合中所有元素的投影。
LINQ只是一组特殊的迭代。
在一天结束时,您对Select
扩展方法的调用是这样的:
foreach(Person person in persons)
{
// This is equivalent to person => person.Address
yield return person.Address;
}
…这就是为什么你得到一个字符串的集合,那里有一个单独的null
ítem.
另一方面,如果你想过滤序列,这样你就不会得到一个有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);