2015-03-04 2 views
2

С учетом функции f:ValueA -> ValueB, как я могу отобразить группировку типа IGrouping<Key, ValueA> на IGrouping<Key, ValueB>?Как сопоставить IGrouping <Key, ValueA> с IGrouping <Key, ValueB>?

Проблема экземпляра:

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

TaggedItem = { Tag:Tag ; Item:Item } 

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

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

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

Решения

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

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

По какой-либо причине вы не можете просто использовать отображение в исходном 'GroupBy'? –

+0

Это тоже сработает, но я не смог найти пример. –

+0

Ну, мы не можем дать вам пример легко, не имея * any * подскажите, что вы группируете. Если бы вы могли предоставить больше контекста, мы могли бы помочь больше. –

ответ

2

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

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

+0

Вот и все. Выполняя поиск «groupBy» на этой странице, я не узнал «groupValBy». –

+0

mapGrouping было то, что я изначально спросил, но мне нравится ваше предложение лучше. –

+0

@ LayGonzález Я действительно не знал о 'groupValBy', прежде чем я увидел ваш вопрос - я нашел его, выполнив поиск только для« группы »на странице :-) – phoog

Смежные вопросы