0

LINQで実行した方がよいとわかっているコードがいくつかありますが、LINQコードがどのようになるかわかりません。

私はGoodsItemsのコレクションを持っています、このアイテムのそれぞれにコメントのコレクションがあります、そしてこれらのコメントのいくつかは私がフィルターで除外して単一の文字列行に変えたいです。

コードは次のとおりです。

                    //-- 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はすべての商品アイテムをループし、各商品アイテムについて、コメントのタイプが定義された値と等しいすべてのコメントを取得します。

次に、取得したこのコメントごとに、新しいオブジェクトを作成して、CommentsCollectionに追加します。

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

LINQを使用してこれを行うには、より優れたスマートな方法が必要です。

ありがとう...

4

1 に答える 1

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。コメントの内容によっては、代わりに使用することをお勧めします。)

于 2012-04-11T08:58:31.060 に答える