Заменить ключ IGrouping?

Можно ли заменить Key с помощью которого IGrouping сгруппирован?

В настоящее время я группируюсь по анонимному типу, как это:

var groups = orders.GroupBy(o => new { o.Date.Year, o.Date.Month });

Но теперь мой ключ группировки - анонимный тип. Я хотел бы заменить этот ключ группировки определенным типом "YearMonth" с переопределенным ToString Метод.

public class YearMonth
{
    public int Year { get; set; }
    public int Month { get; set; }

    public override string ToString()
    {
        return Year + "-" + Month;
    }
}

Есть ли способ заменить группирующий ключ? Или создать новую IGrouping из существующей IGrouping с новым ключом группировки?

1 ответ

Решение

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

Другой простой вариант - создать дату, представляющую месяц, используя постоянный день:

orders.GroupBy(o => new DateTime (o.Date.Year, o.Date.Month, 1))

Тогда у вас есть встроенное равенство значений и форматирование строки.

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

public struct YearMonth
{
    public readonly int Year;
    public readonly int Month;

    public YearMonth(int year, int month)
    {
        Year = year;
        Month = month;
    }

    public override string ToString()
    {
        return Year + "-" + Month;
    }
}
Другие вопросы по тегам