Как заказать СПИСОК в F # - PullRequest
       2

Как заказать СПИСОК в F #

3 голосов
/ 30 ноября 2010

Всего вопросов F # n00b.Как отсортировать структуру данных LIST?

Редактировать: Извините, моя структура данных на самом деле является LIST.

возможно я должен добавить свой код, так как простое использование ".sort" не сработало:

let getDataFromDb (db: MyDB) Id =
Query.query <@ seq { 
    big honking database/FLinq query
    yield  (sec, pm, sr, trade, tradeRec, i, pm_firm, files, lt)
} @> |> List.ofSeq

когда я изменяю последнюю строку кода на это:
} @> |> List.ofSeq.sortBy fst
Я получаю следующее:

Ошибка 1 Поле, конструктор или член 'sortBy' не определены

тьфу, какая боль.Я пытаюсь это сейчас:

|> List.ofSeq |> List.sortBy

Но я получаю это:

Ошибка 1 Несоответствие типов.Ожидается список (Security * RoleContributor * RoleContributor * Предлагаемая торговля * Рекомендуемая торговая рекомендация * Идея * RoleContributor * SupportingUploadedFile * LargeText) -> 'a, но заданный список (' b -> 'c) ->' b -> 'b list Тип' '(Security * RoleContributor * RoleContributor * Предлагаемая торговля * Предлагаемая торговая рекомендация * Идея * RoleContributor * SupportingUploadedFile * LargeText) список 'не соответствует типу' 'a ->' b '

Ответы [ 3 ]

5 голосов
/ 30 ноября 2010

Seq.sortBy сделает это.

Однако сортировка подразумевает, что вы знаете ключевые значения полной последовательности во время сортировки, поэтому по определению вы не можете использовать это для бесконечных последовательностей.

Редактировать: Эквивалент для списков имеет то же имя: List.sortBy

Пример MSDN:

let sortedList2 = List.sortBy (fun elem -> abs elem) [1; 4; 8; -2; 5]
printfn "%A" sortedList2

Редактировать 2:

Из вашего нового примера кажется, что у вас есть список кортежей.Теперь это зависит от того, какой элемент в кортеже вы хотите найти.

4 голосов
/ 01 декабря 2010

Как говорили другие, Seq.sortBy - это путь. Если вы используете FLinq для чтения некоторых данных из базы данных, то хорошей идеей будет включить сортировку как часть запроса к базе данных (заключенную в <@ .. @>), чтобы сортировка выполнялась на сервере SQL:

let getDataFromDb (db: MyDB) Id = 
  <@ seq { big honking database/FLinq query 
             yield  (sec, pm, sr, trade, tradeRec, i, pm_firm, files, lt)
     |> Seq.sortBy (fun (_, _, _, _, _, i, _, _, _) -> i) @>
  |> List.ofSeq 

Чтобы сделать это немного лучше, вы можете вернуть кортеж, содержащий ключ и все другие элементы, как вложенный кортеж, например, key, (sec, pm, ..., lt), а затем просто отсортировать, используя первый элемент:

 |> Seq.sortBy (fun (k, _) -> k)

(У меня были некоторые проблемы при использовании кортежей с LINQ to Entities, но я считаю, что он должен работать в LINQ to SQL).

2 голосов
/ 04 декабря 2010

Использование:

Query.query <@ ... @>
|> List.sortBy (fun (sec, _, _, _, _, _, _, _, _) -> sec)

Обратите внимание, что использование кортежей с таким количеством элементов действительно плохой стиль в F #.Используйте что-то более структурированное, например, тип записи, чтобы дать имена полям и избежать путаницы.

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