拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 LINQ用于多级嵌套集合上的等效for回圈,提取索引信息

LINQ用于多级嵌套集合上的等效for回圈,提取索引信息

白鹭 - 2022-02-17 2125 0 0

我有一个_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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *