通过在Linq

时间:2018-07-10 14:34:24

标签: c# linq delimiter

我正在尝试选择一个本身具有另一个列表的列表。但问题是我需要使用一些定界符来分隔我的两个列表

我的列表是

{
    "Order": {
        "Items": [
            {
                "Details": [
                    {
                        "Product": "XXX",
                        "Category": "YYY"
                    },
                    {
                        "Product": "ZZZ",
                        "Category": "YYY"
                    }
                ]
            },
            {
                "Details": [
                    {
                        "Product": "AAA",
                        "Category": "BBB"
                    }
                ]
            }
        ]
    }
}

我的最终输出应该是

XXX|YYYY^ZZZ|YYY^AAA|BBB

目前,我正在使用如下所示的解决方案。

 StringBuilder output= new StringBuilder();
 string delimiter = "";
 foreach (var items in order.Items) {
      output.Append(delimiter);
      output.Append(string.Join("^",items.Details.Select(l => l.Product+"|"+l.Category)));
      delimiter = "^";
 }    

但这不是最佳选择。请帮忙找到好的。

1 个答案:

答案 0 :(得分:6)

您可以在LINQ的SelectMany中使用单个string.Join

string result = string.Join("^", order.Items.SelectMany(
          item => item.Details.Select(detail => $"{detail.Product}|{detail.Category}")));

这会遍历所有Details中的所有Items并创建您的“产品|类别”字符串。然后这些字符串都以“ ^”作为分隔符。


我不知道您对“好”的标准。如果您认为这是可读的,并且认为您的同事也会理解,那么我认为这很好。也许有更有效的方法(就消耗的时间而言),但是我认为这只有在您拥有数十亿Details或需要每毫秒执行两次的情况下才是真正的问题。