【问题标题】:Linq challenge: converting this piece of code from method chain to standard LinqLinq 挑战:将这段代码从方法链转换为标准 Linq
【发布时间】:2018-10-11 10:12:20
【问题描述】:

挑战在于将一段充满分组依据的代码从方法链转换为标准 linq。

上下文

要完全理解这里的主题,您可以阅读原始问题(带有类定义、示例数据等):Linq: rebuild hierarchical data from the flattened list

感谢@Akash Kava,我找到了解决问题的方法。

链式方法制定

var macroTabs = flattenedList
        .GroupBy(x => x.IDMacroTab)
        .Select((x) => new MacroTab
        {
            IDMacroTab = x.Key,
            Tabs = x.GroupBy(t => t.IDTab)
                    .Select(tx => new Tab {
                        IDTab = tx.Key,
                        Slots = tx.Select(s => new Slot {
                           IDSlot = s.IDSlot
                     }).ToList()
            }).ToList()
        }).ToList();

但是,为了知识起见,我尝试将方法链转换为标准的 Linq 公式,但出了点问题。

发生的事情与此类似..

我尝试将其转换为 Linq 标准语法

var antiflatten = flattenedList
    .GroupBy(x => x.IDMacroTab)
    .Select(grouping => new MacroTab
    {
        IDMacroTab = grouping.Key,
        Tabs = (from t in grouping
                group grouping by t.IDTab
                into group_tx
                select new Tab
                {
                    IDTab = group_tx.Key,
                    Slots = (from s in group_tx
                    from s1 in s    
                    select new Slot
                    {
                        IDSlot = s1.IDSlot
                    }).ToList()
                }).ToList()
    });

LinqPad 中的结果

NetFiddle 上的类和示例数据:

https://dotnetfiddle.net/8mF1qI

【问题讨论】:

    标签: c# linq method-chaining


    【解决方案1】:

    这个挑战帮助我理解了究竟返回 Linq Group By 的内容(以及使用 Group By 的 Linq 语法有多冗长)。

    正如LinqPad 清楚地表明Group By 返回ListGroupsGroup 是一个非常简单的类,它只有一个属性Key

    正如this answer 所说,根据 IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable) 的定义,访问子组内容的唯一方法是遍历元素(一个 foreach、另一个 group by、一个选择,ecc)。

    这里显示了方法链的 Linq 语法公式。

    And here is the source code on Fiddle

    但让我们继续尝试寻找另一种解决方案:

    我们在 SQL 中执行 Group By 时通常所做的是列出所有列已被分组。 与 Linq 不同.. 它仍然返回所有列。

    在此示例中,我们从具有 3 个“列”{IDMacroTab、IDTab、IDSlot} 的数据集开始。我们为第一列分组,但 Linq 会返回整个数据集,除非我们明确告诉他..

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多