Как сопоставить IGrouping<Key, ValueA> с IGrouping<Key, ValueB>?

Учитывая функцию f:ValueA -> ValueBКак я мог сопоставить IGrouping типа IGrouping<Key, ValueA> в IGrouping<Key, ValueB>?

Проблемный экземпляр:

Скажем, у вас есть этот тип:

TaggedItem = { Tag:Tag ; Item:Item }

и этот запрос:

query {
    for i in taggedItems
    groupBy i.Tag into g
    select g
}

Это даст вам следующий тип: IGrouping<Tag, TaggedItem>, но я действительно хочу следующий тип: IGrouping<Tag, Item>, Функция отображения: fun taggedItem -> taggedItem.Item

Решение

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

query {
    for i in taggedItems
    groupValBy i.Tag i.Item into g
    select g
}

1 ответ

Решение

Как насчет этого?

let mapGrouping f (xs : IGrouping<_,_>) =
    let projection = xs |> Seq.map (fun x -> xs.Key, f x)
    (projection.GroupBy (fst, snd)).First()

Из вашего примера кода, я думаю, вы хотите это:

query {
    for i in taggedItems do
    groupValBy i.Item i.Tag into g
    select g
    }

На https://msdn.microsoft.com/en-us/library/hh225374.aspx мы узнаем, что groupValBy msgs tr "выбирает значение для каждого выбранного элемента и группирует элементы по заданному ключу."

Другие вопросы по тегам