为了账号安全,请及时绑定邮箱和手机立即绑定

过滤二维数组的技巧

过滤二维数组的技巧

C#
慕雪6442864 2023-09-09 16:33:11
下面是一个 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"
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

这应该可以解决问题:


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。


查看完整回答
反对 回复 2023-09-09
?
米脂

TA贡献1836条经验 获得超3个赞

像这样的事情怎么样:

items.variants
    .Where(v => v.Prices != null)
    .SelectMany(v => v.prices)
    .Select(p => p.needle.ToString())
    .Distinct();

SelectMany将数组展平prices为单个IEnumerable<Price>.

Selectneedle值投影到IEnumerable<string>.

Distinct只得到不同的needle值。


查看完整回答
反对 回复 2023-09-09
?
茅侃侃

TA贡献1842条经验 获得超21个赞

朝着正确方向的一个小推动可能是您在 select Many 中选择超过 1 个元素,并使用 select 的迭代器参数来稍后获取项目索引。例如:


var result = item.variants

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

    .SelectMany(o => o.prices.Select(x => new {Type = x.needle.GetType(), Value = x.needle}))

    .Select((o, i) => $"[{i}] [{o.Type}] {o.Value}").ToList();


Console.WriteLine(string.Join(",\n", result));


查看完整回答
反对 回复 2023-09-09
  • 3 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信