LINQ用于等价的多级嵌套集合上的循环,提取索引信息



我有一个像这样声明的实例变量_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值(HashSet(仅包含单个值的元素的索引。与此索引一起,我还捕获Dictionary Key和Dictionary值中相应的唯一值。

foreach可以写成

myList.AddRange(_foo[xx]
.Where(zzyy => zzyy.Value.Count == 1)
.Select(zzyy => (xx, zzyy.Value.First(), zzyy.Key)));

在我看来,作为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));

但后来就更冗长了。你可以看到另一个答案,它试图用更长、更复杂的代替前臂

我会把它放在一边,把它归结为";LINQ是一把锤子,但并不是每个问题都是钉子;。。也许花点时间看看你是否可以减少这种错综复杂的嵌套";散列集的字典列表";数据结构,让您更容易使用😀

最新更新