2011-11-23 7 views
0

こんにちは私はラムダ式を使用して匿名型リストをプリミティブ型リストにキャストしようとしています。LambdaまたはLinqを使用して匿名型をプリミティブ型メンバーにキャストする方法

私はforeachを使って 'a'をループして値を得ることができると知っていますが、私はLambdaまたはLinqでそれを行う方法を知りたいと思います。

var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}}; 

List<string> b = a.Select(p => new System.String{p.name}).ToList(); 
List<int> c = a.Select(p => new System.Int32{p.age}).ToList(); 
+0

私は常にオブジェクトにキャストする必要があると思っていました。あなたの答えのおかげでみんな。 –

答えて

2
 var a = new[] { new { name = "jerry", age = 32 }, new { name = "peter", age = 23 } }; 

     List<string> b = a.Select(p => p.name).ToList(); 
     List<int> c = a.Select(p => p.age).ToList(); 

問題はnew System.String{p.name}中の{}とあなたの使用です。これは型をインスタンス化する有効な方法ではありません。

2
var a = new[] { new { name = "jerry", age = 32 },new {name = "peter", age = 23}}; 

List<string> b = a.Select(p => p.name).ToList(); 
List<int> c = a.Select(p => p.age).ToList(); 
2

なぜ、コンストラクタを呼び出して新しいインスタンスをインスタンス化しようとしますか?

この

var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}}; 

List<string> b = a.Select(p => p.name}).ToList(); 
List<int> c = a.Select(p => p.age).ToList(); 

が正常に動作します。 p.Ageは整数なので、値型です。つまり、値によってコピーされるので、リスト内で一意のコピーを取得します。 p.nameは文字列です。 .NETの文字列は不変なので、文字列のインスタンスを完全に共有することはできません。

両方の構文が存在しないことにも注意してください。 コンストラクタを呼び出すときには、()not {}を使用する必要があります。

関連する問題