2017-09-21 19 views
0

ラムダ式を実践するための小さなアプリケーションを作った。私はこのテクニックを初めて使用しています。私は日々のコーディングでそれらを使用することに慣れ親しんで、どれほど強力であるかを実感しています。ラムダ式リストから項目を取得

私は、各ペットがNameと私は私のPetクラスに4匹のペットを追加したAgeを持ってPetという名前のクラスを行っています。

WhereSelect句を使用して、1歳のペットの名前を取得したいと考えています。しかし、私は私のコードを実行する代わりにペットを返すときに、私は

ペットクラス

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

PROGRAMクラス

 var pets = new Pet[] 
     { 
      new Pet {Name="Sharo", Age=8 }, 
      new Pet {Name="Rex", Age=4 }, 
      new Pet {Name="Strela", Age=1 }, 
      new Pet {Name="Bora",Age=1 } 
     }; 

p = pets.Where(pet => pet.Age == 1).Select(pet => pet.Name).ToList(); 

Console.WriteLine(p); 
+0

あなたが期待する何を出力? linqクエリは結果のコレクションを返します。あなたのコードでは、これは名前の集合になります。実際の値を取得するには、それをループする必要があります。 linqクエリが1つの結果だけを返すことを確信しているなら、あなたはToListの代わりにFirstOrDefaultを使うべきです。これは、結果のコレクションの最初の項目を与えるでしょう –

+0

多分あなたは1つだけを期待し、 'First'または' Single'を使います(複数の場合は例外をスローします)。 'string petname = pets.First(p => p.Age == 1).Name;'。これは何もない場合、 'NullRefernceException'をスローします。' Console.WriteLine(p => p.Age == 1)?. Name); ' –

+0

ラムダ式を練習する場合は(デリゲートタイプまたは表現タイプ)。私がお勧めするのは、Where、Select、GroupBy ...メソッドの拡張を実装することです。 LambdaはLINQよりずっと便利です。そして、基本的な実装は、linqメソッドは難しいことではありません。 –

答えて

2
Console.WriteLine(p) 

を行うことができます。

利用代わり

Console.WriteLine(String.Join(",", p)); 

あなたのコードの残りの部分は完全に正しい見えます。

注:あなたがもう少しラムダの練習をしたい場合、あなたはLINQの骨材と、文字列の連結を得ることができます。

Console.WriteLine(p.Aggregate((current, next) => current + ", " + next)); 
+0

ありがとう、これはトリックを行った:) –

0

あなたがToListを行うには、次のSystem.Collections.Generic.List 1 [System.String]

私のコードがあり得るの名前あなたはList<String>

代わりに、デフォルトで型名を返すオブジェクトpToString()メソッドを呼び出し、暗黙的に

foreach(var pet in p) 
    Console.WriteLine(p.Name) 
関連する問題