Linq选择我为什么会收到结果?

时间:2015-06-04 08:29:22

标签: c# .net linq

我的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条目而不是空列表?
  • 我需要更改什么才能获得一个空列表?

提前致谢

3 个答案:

答案 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);