2016-04-07 64 views
2

我在做一個小例子來了解from in selectlinq - from 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

的一切都在這裏首先是匿名類型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

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

匿名類型典型地查詢 表達的選擇子句中用於返回的一個子集屬性來自每個對象在 中的源序列。

匿名類型包含一個或多個公共只讀屬性。其他種類的成員,如方法或事件,都是有效的。 用於初始化屬性的表達式不能爲空,也可能爲 匿名函數或指針類型。

匿名類型是直接從對象派生的類類型,而 不能轉換爲除對象之外的任何類型。

+0

如果OP真的想了解這一點,請下載一個工具,如[do tPeek](https://www.jetbrains.com/decompiler/),反編譯OP的小應用程序,並查看編譯器生成的代碼(使用dotPeek您必須啓用編譯器生成的代碼)。這將*真正*幫助可視化您想要解釋的內容。 – CodingGorilla