我有一个_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 的字典”资料结构你已经进入了更容易使用的东西??
0 评论