Linq选择为什么我得到一个结果

本文关键字:一个 结果 选择 为什么 Linq | 更新日期: 2023-09-27 17:53:21

我的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

Linq选择为什么我得到一个结果

为什么我得到一个空条目而不是空列表?

因为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);