Как сделать соединения в стиле linq-to-IEnumerable в F # - PullRequest
2 голосов
/ 12 июля 2010

У меня есть проект, который я пытаюсь преобразовать в F #, с достаточным количеством запросов стиля linq-to-IEnumerable.Мне интересно, какой самый элегантный способ объединения нескольких списков был бы в F #.Например, если у меня есть куча кода C #, подобного следующему </p> <pre><code> var joinedList = from val1 in list1 join val2 in list2 on val1.Key equals val2.Parent join val3 in list3 on val1.Key equals val3.Parent orderby val1 select new {val1, val2, val3};

, что было бы лучшим способом перевести это на F #?Я оставлю открытым определение «лучший», но я ищу что-то функциональное, а не императивное, и желательно без преобразования моих списков в seqs и / или импорта System.Linq.И ленивые и энергичные решения были бы полезны.И, конечно, многократное использование является ключевым, так как у меня есть такие вопросы во всем.Если есть какой-либо способ использования рабочих процессов для придания более элегантного синтаксиса, это тоже было бы здорово.

Ответы [ 2 ]

3 голосов
/ 12 июля 2010

Ну, в блоге Дона о LINQ и Powerpack:

http://blogs.msdn.com/b/dsyme/archive/2009/10/23/a-quick-refresh-on-query-support-in-the-f-power-pack.aspx

показывает, как выполнять вызовы LINQ join. Но, конечно, это на seq с и с использованием LINQ. Он также указывает, что объединение похоже на условное. Так что я думаю, например ваш пример похож на

let joinedList = [
    for v1 in l1 do
    for v2 in l2 do
    if v1.Key = v2.Parent then
    for v3 in l3 do
    if v1.Key = v3.Parent then
    yield (v1, v2, v3)] |> List.sort

хотя я не проверял это на реальных данных.

1 голос
/ 12 июля 2010

Первая попытка использования конвейеров в упрощенной версии (игнорировать list3):

let res = list1
          |> Seq.collect (fun v1 -> Seq.filter (fun v2 -> v1.Key = v2.Parent) list2 |> Seq.map (fun v2 -> (v1,v2))
          |> Seq.sortBy (fun (x,y) -> x)

, который оставит IEnumerable<Tuple<T1,T2>>. Второй сбор и карта присоединятся к третьему списку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...