C# Использование оператора LINQ 'GroupBy' - PullRequest
1 голос
/ 28 апреля 2020

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

     }                        
 }

У меня есть эта работа, и, возможно, я обдумываю это? Может кто-нибудь предложить какой-либо совет, пожалуйста?

Спасибо

1 Ответ

1 голос
/ 05 мая 2020

вы можете использовать 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)

Я не скажу, что это красиво, но это один из способов сделать это в одном выражении без дублирование кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...