Группировать по строковому массиву в списке элементов c# - PullRequest
1 голос
/ 30 апреля 2020

У меня есть List из BlogPageModel, в List У меня есть строковый массив категории.

Класс модели выглядит следующим образом:

    public class BlogPageModel : BaseModel
    {
        public string Title { get; set; }
        public string Slug { get; set; }
        public string[] Category { get; set; }
    }

Я хочу список все категории с блогами считаются как выходные, то есть

Travel-20
Entertainment-5

Примечание: в списке «Путешествия» 20 значат 20 блогов, в которых есть категория «Путешествия», а «Развлечения 5» означают 5 блогов в категории «Развлечения», помните, что некоторые блоги имеют оба категории.

Я пытался применить GroupBy, как показано ниже:

_client.GetRecords().Result.GroupBy(x => x.Category).Select(x => new { Key = x.Key })

Но это не работает и возвращает список блогов.

Я также попробовал ниже:

enter image description here

Я не уверен, что я делаю неправильно в своем запросе.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Сначала сгладьте результат, используя SelectMany. Вы должны использовать GroupBy Снова для группировки тегов по ключу и, наконец, считать их следующим образом:

var result = _client.GetRecords().Result
                .SelectMany(x => x.Category)
                .GroupBy(x => x)
                .Select(x => $"{x.Key}-{x.Count()}");
2 голосов
/ 30 апреля 2020

Вы можете расширить блоги с их списком категорий до новой последовательности только категории, прежде чем сгруппировать ее:

_client.GetRecords().Result.SelectMany(blog => blog.Category).GroupBy(x => x.Category).Select(x => x.Key + "-" + x.Count());

x - это IGrouping, в основном как список вместе с ключом. Вы можете делать с ним то же, что и в Списке, например, Count или First. Каждый элемент в списке имеет общий ключ, который был выбран как часть GroupBy. В этом случае ваш x, ключом которого является «Путешествие», является списком длинной категории 20

Кстати, (при условии, что GetRecords возвращает задание) подумайте, следует ли вам использовать .Result - он блокирует вызывающий поток до операция завершена, что является отличным способом обнулить все преимущества шаблона Asyn c на основе задач и вернуться к синхронному коду. Если вместо этого вы await GetRecords (который должен называться GetRecordsAsyn c), он освободит поток до go и будет выполнять другие действия, пока возвращаются записи

(await _client.GetRecords()).SelectMany(blog => blog.Category).GroupBy(x => x.Category).Select(x => x.Key + "-" + x.Count());

Если вы хотите чтобы сохранить объект Blog после того, как SelectMany закончил, вы можете использовать:

(await _client.GetRecords()).SelectMany(b => blog.Category, (b, c) => new { Blog = blog, Cat = c })

Вы получите перечисляемый объект, содержащий Nblogs * Ncategories (25 элементов)

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