2012-04-11 9 views
0

LINQで処理されているとわかりやすいコードがありますが、LINQコードの外観はわかりません。このコードをLINQに変換します

私はGoodsItemsのコレクションを持っています。このアイテムのそれぞれには、コメントのコレクションがあります。これらのコメントのいくつかは、フィルタリングして1つの文字列になります。ここで

はコードです:

    //-- get all comments that is of type "GoodsDescription" 
       ICollection<FreeText> comments = new List<FreeText>(); 

       foreach (DSV.Services.Shared.CDM.Shared.V2.GoodsItem goodsItem in shipmentInstructionMessage.ShipmentInstruction.ShipmentDetails.GoodsItems) 
       { 
        ICollection<DSV.Services.Shared.CDM.Shared.V2.FreeText> freeTexts = goodsItem.Comments.Where(c => c.Type.ToLower() == FREETEXT_TYPE_GOODSDESCRIPTION.ToLower()).ToList(); 
        foreach (DSV.Services.Shared.CDM.Shared.V2.FreeText freeText in freeTexts) 
         comments.Add(FreeText.CreateFreeTextFromCDMFreeText(freeText)); 
       } 

       //-- Turn this collection of comments into a single string line 
       StringBuilder sb = new StringBuilder(); 
       foreach (FreeText comment in comments) 
        sb.Append(comment.ToString()); 

       contents = sb.ToString(); 

まず、foreachのは、すべてのgoodsitemsスルーループし、各商品アイテムのために、私はコメントの種類が規定値にEqualeあるすべてのコメントを取得します。

このコメントのforeachを取得すると、新しいObjectが作成され、CommentsCollectionに追加されます。

最後に、このcommentsColletionをループして、すべてのデータを1つの文字列として作成することです。

LINQでこれを行うには、よりスマートな方法が必要です。あなたがこれを行うことができますように見えます

おかげで...

答えて

1

var comments = from goodsItem in shipmentInstructionMessage.ShipmentInstruction.ShipmentDetails.GoodsItems 
       from freeText in goodsItem.Comments.Where(c => string.Equals(c.Type, FREETEXT_TYPE_GOODSDESCRIPTION, StringComparison.InvariantCultureIgnoreCase)) 
       select FreeText.CreateFreeTextFromCDMFreeText(freeText).ToString(); 
string contents = string.Join("", comments); 

あなたがタイプのほとんどを失ってしまったという理由だけであれば、あなたも持っている可能性が、それは(おそらくもう少し読みやすいです暗黙のうちにタイプされたローカル変数でこれを達成しました)。

(コメントタイプの文字列比較がどのように行われたかを変更しました)コメントの内容に応じて、代わりにStringComparison.CurrentCultureIgnoreCaseを使用することをお勧めします。

+0

もっとよく見えます!あなたもlambasを使用しているバージョンを持っていますか? –

+0

@Magnus技術的に、私たちはすでにこのファイルにラムダを持っています。これをメソッド構文(これはコンパイラがとにかくやっていることです)に入れたいと思ったら、このようなものになります。 –

+0

最初のfrom _ _ _は... .GoodsItems.SelectMany(goodsItem => goodsItem.Comments.Where(...))になり、次に.Select(c => CreateFreeText(c).ToString())になります。正式なアドバイスは、クエリの構文を使用することです、私は彼らがここにいると思います!とにかく助けてくれることを願います。 –

関連する問題