Linq 挑战:将这段代码从方法链转换为标准 Linq
Linq challenge: converting this piece of code from method chain to standard Linq
挑战在于将一段充满 group by 的代码从方法链转换为标准 linq。
上下文
要完全理解此处的主题,您可以阅读原始问题(带有 class 定义、示例数据等):
感谢@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 中的结果
classes 和 NetFiddle 上的示例数据:
这个挑战帮助我理解 returnLinq Group By 到底是什么(以及 Group By 的 Linq 语法有多冗长)。
As LinqPad
清楚地显示了 Group By returns a List
of Groups
。 Group
是一个非常简单的 class,其中 只有一个 属性:一个 Key
如 this answer 所述,根据 IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
) 的定义,唯一 访问子组内容的方法是遍历元素(一个foreach,另一个group by,一个select, ecc).
此处显示了方法链的 Linq 语法公式。
And here is the source code on Fiddle
但是让我们继续尝试看看另一个解决方案:
我们在SQL中做一个Group By时通常做的是列出所有列但是已经分组的那个。 与 Linq 不同..它仍然 return 所有列。
在这个例子中,我们从一个包含 3 'columns' {IDMacroTab, IDTab, IDSlot} 的数据集开始。我们为第一列分组,但 Linq 会 return 整个数据集,除非我们明确告诉他..
挑战在于将一段充满 group by 的代码从方法链转换为标准 linq。
上下文
要完全理解此处的主题,您可以阅读原始问题(带有 class 定义、示例数据等):
感谢@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 中的结果
classes 和 NetFiddle 上的示例数据:
这个挑战帮助我理解 returnLinq Group By 到底是什么(以及 Group By 的 Linq 语法有多冗长)。
As LinqPad
清楚地显示了 Group By returns a List
of Groups
。 Group
是一个非常简单的 class,其中 只有一个 属性:一个 Key
如 this answer 所述,根据 IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable
) 的定义,唯一 访问子组内容的方法是遍历元素(一个foreach,另一个group by,一个select, ecc).
此处显示了方法链的 Linq 语法公式。
And here is the source code on Fiddle
但是让我们继续尝试看看另一个解决方案:
我们在SQL中做一个Group By时通常做的是列出所有列但是已经分组的那个。 与 Linq 不同..它仍然 return 所有列。
在这个例子中,我们从一个包含 3 'columns' {IDMacroTab, IDTab, IDSlot} 的数据集开始。我们为第一列分组,但 Linq 会 return 整个数据集,除非我们明确告诉他..