C#LINQ';GroupBy';操作员使用

C#LINQ';GroupBy';操作员使用,c#,linq,group-by,C#,Linq,Group By,在c#中,在通过“TeamFixtureResultPage”类型集合进行枚举后,我使用LINQ运算符“GroupBy”使用实例上设置的dateTime值按月对项目进行分组。正如预期的那样,当它完成处理时,将返回一个IEnumerable 我希望可以选择对已排序的月份和已排序的team fixture结果页面类型进行升序或降序排序。为了实现这一点,目前我有下面的代码,尽管生成了我想要的输出,但这一切都感觉有点笨拙,感觉我违背了干燥的原则?或许还有更好的方法来实现这一点 IEnume

在c#中,在通过“TeamFixtureResultPage”类型集合进行枚举后,我使用LINQ运算符“GroupBy”使用实例上设置的dateTime值按月对项目进行分组。正如预期的那样,当它完成处理时,将返回一个
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)