Я довольно новичок в функциональном программировании, и поэтому F #, и у меня есть серьезные проблемы, чтобы найти правильное решение для этой проблемы.
У меня есть последовательность типов записей, скажем, как:
type Invoice = {
GrpText : string
GrpRef : int
Article : int
Wkz : int
Text : string
Price : decimal
InvoiceRef : int
}
Теперь я хочу сгруппировать или агрегировать последовательность Invoices
по заданным критериям и т.е. суммировать их цены.Invoices
, который не соответствует критериям, не следует группировать и просто возвращать такими, какие они есть.
Функция критериев может выглядеть следующим образом:
/// determines whether to group the two given Invoice items or not
let criteria item toCompareWith =
(item.GrpRef > 0 && item.Article = toCompareWith.Article
&& item.InvoiceRef = toCompareWith.InvoiceRef) ||
(item.Wkz <> 0 && item.Text = toCompareWith.Text)
Агрегирование или группировка могут выглядеть следующим образомэто:
/// aggregate the given Invoice items
let combineInvoices item1 item2 =
{item1 with Price = item1.Price + item2.Price; Wkz = 0}
Проблема выглядит довольно простой, но я в настоящее время недостаточно опытен в функциональном программировании для соединения точек.
Редактировать:
Я только что изменил функцию criteria
, чтобы лучше показать, что она может быть немного сложнее, чем группировка по одному или нескольким полям.