C# LINQ 'GroupBy'运算符用法



在c#中,在枚举"TeamFixtureResultPage"类型的集合后,我使用LINQ运算符"GroupBy",使用实例上设置的dateTime值按月对项目进行分组。正如预期的那样,当它完成处理时,返回一个IEnumerable<IGrouping<int, TeamFixtureResultPage>>

我希望可以选择升序或降序排列已排序的月份和已排序的团队固定结果页面类型。为了实现这一点,我现在有以下代码,尽管产生了我想要的输出,但这一切都感觉有点笨拙,感觉我违背了DRY原则?也许还有更好的方法来实现这一点。

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
}

在这一点上,我有几个问题。

Q1.有没有可能减少这一点,因为我有效地调用了以下两次

groupedFixResList = seasonLandingPage
.Children<TeamFixtureResultPage>()

Q2.TeamFixtureResultPage的属性比我实际需要传递到视图的属性多得多,所以我是否可以在同一个LINQ语句中创建一个新对象,例如在中添加以下内容。选择某个地方?

var fixtureResult = new fixtureResult() 
{        
Scoreline = x.scoreline,
FixtureDate = x.fixtureDate    
}

我可以在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);
}                        
}

我有这个工作,可能想得太多了?有人能提供一些建议吗?

谢谢

您可以使用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)

我不会说它很漂亮,但这是在一条语句中做到这一点而不重复代码的一种方法。

最新更新