3 回答

TA貢獻(xiàn)1777條經(jīng)驗 獲得超10個贊
這應(yīng)該可以解決問題:
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();
對于這樣的結(jié)構(gòu):
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 并將其轉(zhuǎn)換為普通數(shù)組。[ [1, 2], [3, 4] ] => [ 1, 2, 3, 4 ],并.Distinct丟棄重復(fù)的值。
我想出的代碼幾乎和你的一模一樣??雌饋砟阏谧?Distincton .Select,而不是 on .SelectMany。有什么不同?.Select選擇一個值(在本例中) - 對它調(diào)用 Distinct 是沒有意義的,這會刪除重復(fù)項。.SelectMany選擇許多值 - 所以如果你想在某個地方調(diào)用 Distinct,它應(yīng)該在 的結(jié)果上SelectMany。

TA貢獻(xiàn)1836條經(jīng)驗 獲得超3個贊
像這樣的事情怎么樣:
items.variants .Where(v => v.Prices != null) .SelectMany(v => v.prices) .Select(p => p.needle.ToString()) .Distinct();
SelectMany
將數(shù)組展平prices
為單個IEnumerable<Price>
.
Select
將needle
值投影到IEnumerable<string>
.
Distinct
只得到不同的needle
值。

TA貢獻(xiàn)1842條經(jīng)驗 獲得超22個贊
朝著正確方向的一個小推動可能是您在 select Many 中選擇超過 1 個元素,并使用 select 的迭代器參數(shù)來稍后獲取項目索引。例如:
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 關(guān)注
- 190 瀏覽
添加回答
舉報