linq - 来自选择

时间:2016-04-07 13:37:53

标签: c# linq

我正在做一个小例子来了解from in select

我的例子:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }
}
class Program
{
    static void Main()
    {
        var list = new List<Person>();
        list.Add(new Person(name: "Hermione", age: 20));

        var persons = from p in list select new { p.Age, p.Name };            
        foreach (var person in persons)
        {
            Console.WriteLine($"Name: {person.Name}. Age: {person.Age}");
        }

        var _persons = from p in list select new Person(p.Name, p.Age);
        foreach (var person in _persons)
        {
            Console.WriteLine($"Name: {person.Name}. Age: {person.Age}");
        }
    }
}

他们两个都有相同的结果:

  

姓名:赫敏。年龄:20

我的问题:第一个和第二个之间有什么区别?什么时候使用第一个/第二个?

2 个答案:

答案 0 :(得分:3)

var persons = from p in list select new { p.Age, p.Name }; - 创建匿名类型

var _persons = from p in list select new Person(p.Name, p.Age); - 创建人

根据https://msdn.microsoft.com/en-us/library/bb397696.aspx

  

匿名类型通常用在查询的select子句中   表达式从中返回每个对象的属性子集   源序列。

     

匿名类型包含一个或多个公共只读属性。没有   其他类成员(例如方法或事件)是有效的。   用于初始化属性的表达式不能为null,   匿名函数或指针类型。

     

匿名类型是直接从object派生的类类型   不能转换为除object之外的任何类型。

答案 1 :(得分:3)

首先,这里是匿名类型var persons = from p in list select new { p.Age, p.Name };所以你可以制作属性的随机名称,例如

 var persons = from p in list select new { AgesSomeWithDay = p.Age , FullName = p.Name + p.Name };  

但是 var _persons = from p in list select new Person( p.Name, p.Age); 是强类型的,您不能创建随机命名属性,因为这里是new PersonPerson类包含两个属性,您只能分配给_persons