C#LINQ';GroupBy';操作员使用
在c#中,在通过“TeamFixtureResultPage”类型集合进行枚举后,我使用LINQ运算符“GroupBy”使用实例上设置的dateTime值按月对项目进行分组。正如预期的那样,当它完成处理时,将返回一个C#LINQ';GroupBy';操作员使用,c#,linq,group-by,C#,Linq,Group By,在c#中,在通过“TeamFixtureResultPage”类型集合进行枚举后,我使用LINQ运算符“GroupBy”使用实例上设置的dateTime值按月对项目进行分组。正如预期的那样,当它完成处理时,将返回一个IEnumerable 我希望可以选择对已排序的月份和已排序的team fixture结果页面类型进行升序或降序排序。为了实现这一点,目前我有下面的代码,尽管生成了我想要的输出,但这一切都感觉有点笨拙,感觉我违背了干燥的原则?或许还有更好的方法来实现这一点 IEnume
IEnumerable
我希望可以选择对已排序的月份和已排序的team fixture结果页面类型进行升序或降序排序。为了实现这一点,目前我有下面的代码,尽管生成了我想要的输出,但这一切都感觉有点笨拙,感觉我违背了干燥的原则?或许还有更好的方法来实现这一点
IEnumerable<IGrouping<int, TeamFixtureResultPage>> groupedFixResList = null;
if (teamFixResLandingPage.FixturesDisplay == "descending")
{
groupedFixResList = seasonLandingPage
.Children<TeamFixtureResultPage>()
.OrderByDescending(x => x.KickOffTime)
.GroupBy(x => x.KickOffTime.Month)
.OrderBy(group => group.Key)
.Reverse();
//example output (descending)
//MAY
// -Fixture 1 20/05/2020
// -Fixture 2 15/05/2020
// -Fixture 3 10/05/2020
//APRIL
// -Fixture 1 27/04/2020
// -Fixture 2 18/04/2020
// -Fixture 3 13/04/2020
}
else
{
groupedFixResList = seasonLandingPage
.Children<TeamFixtureResultPage>()
.OrderBy(x => x.KickOffTime)
.GroupBy(x => x.KickOffTime.Month)
.OrderBy(group => group.Key);
//example output (ascending)
//APRIL
// -Fixture 3 13/04/2020
// -Fixture 2 18/04/2020
// -Fixture 1 27/04/2020
//MAY
// -Fixture 3 10/05/2020
// -Fixture 2 15/05/2020
// -Fixture 1 20/05/2020
}
在LINQ语句之后,我可以执行以下操作
var newGroupedFixResList = new List<FixtureResult>();
foreach (var group in groupedFixResList)
{
foreach (var item in group)
{
var fixRes = new FixtureResult()
{
//map properties
}
newGroupedFixResList.Add(fixRes);
}
}
var newGroupedFixResList=newlist();
foreach(groupedFixResList中的var组)
{
foreach(组中的var项目)
{
var fixRes=new FixtureResult()
{
//地图属性
}
newGroupedFixResList.Add(fixRes);
}
}
我正在工作,可能是想得太多了?有人能给点建议吗
谢谢您可以使用1 \-1作为选择排序方向的乘数,如下所示:
bool reverseOrder = teamFixResLandingPage.FixturesDisplay == "descending";
int orderSign = reverseOrder ? -1 : 1;
groupedFixResList = seasonLandingPage
.Children<TeamFixtureResultPage>()
.OrderBy(x => orderSign * x.KickOffTime.Ticks)
.GroupBy(x => x.KickOffTime.Month)
.OrderBy(group => orderSign * group.Key)
bool reverseOrder=teamFixResLandingPage.FixturesDisplay==“下行”;
int orderSign=reverseOrder-1 : 1;
groupedFixResList=季节性登陆页面
.儿童()
.OrderBy(x=>orderSign*x.KickOffTime.Ticks)
.GroupBy(x=>x.KickOffTime.Month)
.OrderBy(group=>orderSign*group.Key)
我不会说它很漂亮,但这是一种在一条语句中实现这一点而不需要代码重复的方法。不需要在分组之前进行排序,在分组之后有条件地在末尾进行排序。嗨,Oliver,也许我做得不对,但我发现当我没有在groupby之前应用排序时,子项不符合降序的顺序。你能详细说明一下吗?Thanks我的意思是,你可以在最后进行订购,如果你将项目投射到你想要的类型,你可以根据选择的订购类型在该点订购内部集合-无需在
GroupBy
之前进行订购。为什么OrderBy
然后Reverse
而不是一个OrderByDescending
?嘿@Evyatar,我不确定,当时我试了很多东西,但都忘了。我已经更新到OrderBYDescending,因为这很有意义。谢谢你指出这一点
var newGroupedFixResList = new List<FixtureResult>();
foreach (var group in groupedFixResList)
{
foreach (var item in group)
{
var fixRes = new FixtureResult()
{
//map properties
}
newGroupedFixResList.Add(fixRes);
}
}
bool reverseOrder = teamFixResLandingPage.FixturesDisplay == "descending";
int orderSign = reverseOrder ? -1 : 1;
groupedFixResList = seasonLandingPage
.Children<TeamFixtureResultPage>()
.OrderBy(x => orderSign * x.KickOffTime.Ticks)
.GroupBy(x => x.KickOffTime.Month)
.OrderBy(group => orderSign * group.Key)