2016-04-07 24 views
2

私はちょっと例を挙げて、from in selectについて理解しています。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番目の違いは何ですか?そして、最初の/秒を使うときは?

答えて

2

まず第一には、ここであなたは一例

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); のプロパティのランダムな名前を作ることができます匿名型var persons = from p in list select new { p.Age, p.Name };であるここにあるので、強くあなたがランダムな名前付きプロパティを作成することはできません入力されますnew PersonおよびPersonクラスには、_personsにのみ割り当て可能な2つのプロパティが含まれています

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);を作成する - 通常のサブセットを返すために、クエリ 式のselect句で使用されているhttps://msdn.microsoft.com/en-us/library/bb397696.aspx

匿名型によると、人

を作成します の各オブジェクトのプロパティをソースシーケンスとします。

匿名型には、1つ以上のパブリックの読み取り専用プロパティが含まれています。いいえ メソッドやイベントなど、他の種類のクラスメンバーが有効です。 プロパティを初期化するために使用される式は、NULL、 の匿名関数、またはポインタ型にすることはできません。

匿名型はオブジェクトから直接派生するクラス型で、 はオブジェクト以外の型にキャストできません。

+0

OPが本当にこれを理解したい場合は、[do tPeek](https://www.jetbrains.com/decompiler/)を開き、OPの小さなアプリケーションを逆コンパイルし、コンパイラが生成したコードを見てください(dotPeekでコンパイラ生成コードを有効にする必要があります)。これはあなたが説明しようとしていることを実際に視覚化するのに役立ちます。 – CodingGorilla

関連する問題