Как сопоставить 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 "выбирает значение для каждого выбранного элемента и группирует элементы по заданному ключу."