2016-06-29 16 views
-1

一覧ラムダ式

var myData = CustomerObj.orders.Select(x => new MyOrderInfo(x)); 

は、誰も私がライン上に理解するのに役立つことはできますか?私がデバッグし、myDataの値を見ると、私の驚いたことに、 "Address1"にxxxxの値が設定されています。どのように機能していますか?私は

get { return _order.ShiptoAddress[xxx].Value; } 

とMyOderInfoクラス内の他のプロパティのカップルを持っており、それらのすべてが設定されている適切な値を....持っていますか?このコードはどのように機能していますか?

+0

あなたはどうですか? – Servy

+1

これをループごとに書き、linqと比較してください(http://stackoverflow.com/questions/24193898/how-do-i-convert-foreach-statement-into-linq-expression) – sous2817

+0

@ sous2817:i foreachにそれを変換しようとしましたが...あなたはforeachの例にその行を変換してください... – bansi

答えて

0

Linqクエリはデバッグするのが難しいです。実際に作成するものは、元のデータの周りに「ラッパー」のセットがあるため、実際の結果がどのようなものかをデバッガで調べるだけではわかりません。

結果を確認する最も良い方法は、クエリを具体化することです。これを行う最も簡単な方法は、ToArrayまたはToListを呼び出して、具体的なデータ構造にクエリを水和することです。プログラム自体でも、またはwatch/immediateウィンドウでも、ToListを呼び出しての各時刻にを呼び出すと、ソースデータを複数回繰り返して問題が発生する可能性があります。

1

Selectのための署名を見てみる:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 

(ジェネリック引数コンパイラが推論を含む)あなたのLINQクエリは次のとおりです。だから、

orders.Select<Order, MyOrderInfo>(x => new MyOrderInfo(x)); 

、引数から、それはIEnumerable<Order>を取っていますIEnumerable<MyOrderInfo>を返します。 FuncあなたはちょうどそれをやるべきSelectに渡す:

x => new MyOrderInfo(x) 

これはあなたが書くだろうメソッドのためだけの匿名メソッド、簡略化したものです。それがここに置換することができ書き出さフル方法は次のようになります。

public MyOrderInfo GetOrderInfo(Order x) 
{ 
    return new MyOrderInfo(x); 
} 

MyOrderInfoそれがすべて罰金コンパイルので、Orderを取るコンストラクタを持っています。


Address1ゲッターを持っているので、あなたは(それが本当にある)、ここでの方法と同じように考えることができます。 Address1にアクセスするたびに、_order.ShiptoAddress[0].Value;が表示されます。 _orderがコンストラクタでインスタンス化されました。したがって、ShipToAddressに少なくとも1つの項目がある限り、動作します。

+0

@Jonesoplis:素敵な説明...意味がある...しかし、私はそれがどのようにMyOderInfoクラスの値を設定するのだろうか?MyOderInfoのAddress1と他のすべてのプロパティが自動的に設定されます。どうやって? – bansi

+0

もう少し追加しました – Jonesopolis

+0

@Jonseopolis:ok。とった。ありがとう.....私はこれをもっと学びたい、詳細な説明があるウェブサイトを知っていますか?私はグーグルで私は役に立たないものは見つけられませんでした。 – bansi