C#LINQ'GroupBy'运算符用法

问题描述 投票:0回答:1

在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语句中创建一个新对象,例如在.Select中添加以下内容?

    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);

     }                        
 }

我有这个工作,可能想得太多了?任何人都可以提供任何建议吗?

谢谢

c# linq group-by
1个回答
0
投票
bool reverseOrder = teamFixResLandingPage.FixturesDisplay == "descending"; int orderSign = reverseOrder ? -1 : 1; groupedFixResList = seasonLandingPage .Children<TeamFixtureResultPage>() .OrderBy(x => orderSign * x.KickOffTime) .GroupBy(x => x.KickOffTime.Month) .OrderBy(group => orderSign * group.Key)
© www.soinside.com 2019 - 2024. All rights reserved.