我有一個_foo像這樣宣告的實體變數-
List< Dictionary<int, HashSet<int> > > _foo;
是的,它是一個混亂的資料結構,它是一個字典串列,其鍵是整數,其關聯值是整數的 HashSet。
我想知道是否可以撰寫一個與此代碼片段等效的 LINQ 運算式:
var myList = new List<(int, int, int)>();
for (int xx = 0; xx < _foo.Count; xx)
foreach (var zzyy in _foo[xx])
if (zzyy.Value.Count == 1)
myList.Add((xx, zzyy.Value.First, zzyy.Key));
換句話說,我想捕獲 List 中其 Dictionary-value (a HashSet) 僅包含一個值的元素的索引。連同這個索引,我還捕獲了 Dictionary-Key 和 Dictionary-value 中相應的唯一值。
uj5u.com熱心網友回復:
foreach 可以寫成
myList.AddRange(_foo[xx]
.Where(zzyy => zzyy.Value.Count == 1)
.Select(zzyy => (xx, zzyy.Value.First(), zzyy.Key)));
uj5u.com熱心網友回復:
在我看來,作為 Linq 的整個事情都是
var myList = _foo.SelectMany((d,x) =>
d.Where(kvp => kvp.Value.Count==1)
.SelectMany(
kvp => kvp.Value,
(kvp, hsv) => (x,kvp.Key,hsv)
)
).ToList();
..但老實說,我不確定它是否比您擁有的更清晰或更高效..
考慮到你有你寫的東西,它作業,很容易理解和除錯..而不得不尋求外部幫助將它轉換成更難理解的形式意味著如果需要,除錯會變得更加困難
我確實認為使用部分 LINQ 可能會有所幫助:
var myList = new List<(int, int, int)>();
for (int fi = 0; fi < _foo.Count; fi)
foreach (var kvp in _foo[fi].Where(kvp => kvp.Value.Count == 1))
myList.Add((fi, kvp.Value.First(), kvp.Key));
..但是然后它就更羅嗦了。您可以看到另一個答案,它試圖用更長更復雜的東西替換 foreach
我不理會它,把它歸結為“LINQ是一把錘子,但不是每個問題都是釘子”的情況之一。也許花時間看看你是否可以減少這個令人費解的嵌套“串列hashsets 的字典”資料結構你已經進入了更容易使用的東西??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/405939.html
標籤:
