【问题标题】:Turn this code into LINQ将此代码转换为 LINQ
【发布时间】:2012-04-11 17:13:25
【问题描述】:

我有一些代码,我知道如果在 LINQ 中完成会更好,但我不知道 LINQ 代码会是什么样子。

我有一个 GoodsItems 集合,在每个这个 Item 中都有一个 Collection of Comments,我想过滤掉其中的一些 cmets 并变成单个字符串行。

代码如下:

                    //-- 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,对于每个商品,我得到所有 cmets,其中评论的类型等于定义的值。

然后,对于我得到的这个评论,我创建一个新对象并添加到 CommentsCollection。

最后一件事是我循环通过这个 cmetsColletion 并将它的所有数据创建到单个字符串行中。

使用 LINQ 必须有更好、更智能的方法。

谢谢...

【问题讨论】:

    标签: 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,具体取决于 cmets 的内容。 )

    【讨论】:

    • 看起来好多了!你也有使用lambas的版本吗:)
    • @Magnus 从技术上讲,我们已经有一个 lambda 了;)。如果您想将其放入方法语法中(无论如何编译器都会这样做),它会像这样。
    • 第一个 from _ in _ 变成 ....GoodsItems.SelectMany(goodsItem => goodsItem.Comments.Where(...)) 然后你有 .Select(c => CreateFreeText(c).ToString( ))。官方建议是使用查询语法,我认为它们就在这里!希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多