Ответ 1
Кажется, что вы можете просто объединить все списки, а затем использовать Seq.groupBy
, чтобы получить список, содержащий уникальные идентификаторы во входных списках и все значения, связанные с идентификатором. Это можно сделать, используя что-то вроде:
let data =
[ data1; data2; data3; data4 ] // Create list of lists of items
|> Seq.concat // Concatenate to get a single list of items
|> Seq.groupBy (fun d -> d.ID) // Group elements by ID
seq { for id, values in data ->
// ID is the id and values is a sequence with all values
// (that come from any data source) }
Если вы хотите связать источник (будь то операция data1
, data2, etc...) with the value then you can first use
map`, чтобы добавить индекс источника данных:
let addIndex i data =
data |> Seq.map (fun v -> i, v)
let data =
[ List.map (addIndex 1) data1;
List.map (addIndex 2) data2;
List.map (addIndex 3) data3;
List.map (addIndex 4) data4 ]
|> Seq.concat
|> Seq.groupBy (fun (index, d) -> d.ID)
Теперь data
также содержит индекс источника данных (от 1 до 3), поэтому при итерации по значениям вы можете использовать индекс, чтобы узнать, из какого источника данных приходит элемент. Даже более приятную версию можно записать с помощью Seq.mapi
для перебора списка источников данных и автоматического добавления индекса ко всем значениям:
let data =
[ data1; data2; data3; data4 ]
|> Seq.mapi (fun index data -> Seq.map (addIndex index) data)
|> Seq.concat
|> Seq.groupBy (fun (index, d) -> d.ID)