我正試圖對一個簡單的異質容器進行迭代。Dictionary<string, object>。
它的構造是這樣的:
var d = new Dictionary< string, object>()。
d.Add("key1"/span>, "value1"/span>)。
d.Add("key2", 42) 。
var sub = new Dictionary<string, object> ()。
sub.Add("key3", new double[] { 0, 0 }) 。
d.Add("key4", sub)。
我想我可以寫一個簡單的函式:
public IEnumerable<KeyValuePair< string, object> > flatten(IDictionary<string, object> dict)
{
foreach(KeyValuePair<string, object> itemin dict)
{
if (item.Value is IDictionary<string, object> subDict)
{
flatten(subDict)。
}
else[/span
{
yield return item。
}
}
我如何改寫上述flatten函式,以便:
var l = flatten(d).ToList() 。
回傳一個包含三個專案的串列(鍵為:key1、key2和key3)。到目前為止,我還沒能在我的案例中使用Linq包的SelectMany...
uj5u.com熱心網友回復:
嘗試回傳flatten遞回呼叫的結果:
public IEnumerable<KeyValuePair< string, object> > flatten(IDictionary<string, object> dict)
{
foreach (KeyValuePair<string, object> item in Dict)
{
if (item.Value is IDictionary<string, object> subDict)
{
foreach (var item2 in flatten(subDict))
{
yield return item2。
}
}
else item2; }
{
yield return item。
}
}
uj5u.com熱心網友回復:
如果你想使用SelectMany,你實際上需要將一個非IDictionary<...>投射到一個IEnumerable(以便dict被始終認為是一個要被扁平化的集合):
public IEnumerable<KeyValuePair< string, object> > flatten(IDictionary<string, object> dict)
{
return dict.SelectMany(kv => kv.Value switch {
IDictionary<string, object> subdict => flatten(subdict)。
_ => Enumerable.Repeat(kv, 1)
});
}
實時演示
我們不需要說yield return,因為SelectMany是直接回傳一個IEnumerable
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/310089.html
標籤:
下一篇:<p>我想把以下嵌套串列中的值<code>_values(Freezer01,Freezer02,Freezer03)</code>寫進<code>Li
