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。
TA贡献1836条经验 获得超3个赞
像这样的事情怎么样:
items.variants .Where(v => v.Prices != null) .SelectMany(v => v.prices) .Select(p => p.needle.ToString()) .Distinct();
SelectMany
将数组展平prices
为单个IEnumerable<Price>
.
Select
将needle
值投影到IEnumerable<string>
.
Distinct
只得到不同的needle
值。
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));
- 3 回答
- 0 关注
- 136 浏览
添加回答
举报