通过在Linq中分隔分隔符来选择另一个列表的列表

Jay*_*ran 1 c# linq delimiter

我正在尝试选择一个列表,其中包含另一个列表.但问题是我需要使用一些分隔符来分隔我的两个列表

我的名单是

{
    "Order": {
        "Items": [
            {
                "Details": [
                    {
                        "Product": "XXX",
                        "Category": "YYY"
                    },
                    {
                        "Product": "ZZZ",
                        "Category": "YYY"
                    }
                ]
            },
            {
                "Details": [
                    {
                        "Product": "AAA",
                        "Category": "BBB"
                    }
                ]
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我的最终输出应该是这样的

XXX|YYYY^ZZZ|YYY^AAA|BBB
Run Code Online (Sandbox Code Playgroud)

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

 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 = "^";
 }    
Run Code Online (Sandbox Code Playgroud)

但这不是最好的选择.请帮助找到好的.

Ren*_*ogt 6

您可以使用string.JoinLINQ的单个SelectMany:

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

这总结Details了所有Items并创建了"Product | Category"字符串.然后这些字符串都以"^"作为分隔符连接.


我不知道你对"好"的标准.如果您发现这种可读性并认为您的同事也会理解它,我想这很好.可能有更有效的方法(就消耗的时间而言),但我认为如果您有数十亿Details或需要每毫秒执行两次,这只会是一个真正的问题.