过滤二维数组的技巧

下面是一个 JSON 示例:


 item: {

   id: 1,

   variants: [

    {

     id: 1,

     prices: [

      {

       needle: 100

      },

      {

       needle: 200

      }

     ]

    }

   ]

 }


基本上我希望能够选择价格范围内的所有针值。有人能把我推向正确的方向吗?


如果价格维度不存在,我将能够执行以下操作:


item.variants.Select(v => v.needle.ToString()))


我尝试过什么...


item.variants.Where(x => x.prices != null)

               .SelectMany(v => 

                 v.prices.Select(p => 

                   p.needle.ToString()

                 ).Distinct()

               )


结果应该是


[0] [string] "100", 

[1] [string] "200"


慕雪6442864
浏览 139回答 3
3回答

不负相思意

这应该可以解决问题:var result = structure.variants                     // Throw away variants without prices                    .Where(variant => variant.prices != null)                    // For each variant, select all needle prices (.toString) and flatten it into 1D array                    .SelectMany(variant => variant.prices.Select(price => price.needle.ToString()))                    // And choose only unique prices                    .Distinct();对于这样的结构:var structure = new Item(                new Variant(new Price(200), new Price(100), new Price(800)),                new Variant(new Price(100), new Price(800), new Price(12))            );是输出[ 200, 100, 800, 12 ]。它是如何工作的?.SelectMany基本上采用 array-inside-array 并将其转换为普通数组。[ [1, 2], [3, 4] ] => [ 1, 2, 3, 4 ],并.Distinct丢弃重复的值。我想出的代码几乎和你的一模一样。看起来你正在做.Distincton .Select,而不是 on .SelectMany。有什么不同?.Select选择一个值(在本例中) - 对它调用 Distinct 是没有意义的,这会删除重复项。.SelectMany选择许多值 - 所以如果你想在某个地方调用 Distinct,它应该在 的结果上SelectMany。

米脂

像这样的事情怎么样:items.variants &nbsp;&nbsp;&nbsp;&nbsp;.Where(v&nbsp;=>&nbsp;v.Prices&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;.SelectMany(v&nbsp;=>&nbsp;v.prices) &nbsp;&nbsp;&nbsp;&nbsp;.Select(p&nbsp;=>&nbsp;p.needle.ToString()) &nbsp;&nbsp;&nbsp;&nbsp;.Distinct();SelectMany将数组展平prices为单个IEnumerable<Price>.Select将needle值投影到IEnumerable<string>.Distinct只得到不同的needle值。

茅侃侃

朝着正确方向的一个小推动可能是您在 select Many 中选择超过 1 个元素,并使用 select 的迭代器参数来稍后获取项目索引。例如:var result = item.variants&nbsp; &nbsp; .Where(x => x.prices != null)&nbsp; &nbsp; .SelectMany(o => o.prices.Select(x => new {Type = x.needle.GetType(), Value = x.needle}))&nbsp; &nbsp; .Select((o, i) => $"[{i}] [{o.Type}] {o.Value}").ToList();Console.WriteLine(string.Join(",\n", result));
打开App,查看更多内容
随时随地看视频慕课网APP