F # - Преобразование вложенных for-loops в функциональный стиль
Я пытаюсь преобразовать свои вложенные петли в более функциональный стиль.
Я возился с конвейерной обработкой, последовательностями и массивами, но безрезультатно.
Вот что у меня есть:
let allCarrierCodes = new List<string>()
for result in getAllCarrierCodesResults do
for carrierCode in result do
allCarrierCodes.Add(carrierCode.ToString())
-
getAllCarrierCodesResults
является seq типа "obj list"
Какой хороший функциональный способ переписать вложенные циклы?
Спасибо.
Ответы
Ответ 1
Вы можете использовать Seq.collect
:
let allCodes = Seq.collect id getAllCarrierCodesResults
|> Seq.map string)
или
let allCodes = Seq.collect (Seq.map string) getAllCarrierCodesResults
вы можете затем преобразовать полученный seq<string>
в конкретную коллекцию, которую вы хотите.
Ответ 2
Ответ Ли лучше, чем этот, но я просто хотел упомянуть, что вы можете полностью просто вставить те вложенные петли внутри понимания списка, а voila:
let allCarrierCodes =
[for result in getAllCarrierCodesResults do
for carrierCode in result do
yield carrierCode.ToString()]
Выглядит как настоятельный, но действительно функциональный.
Кроме того, вы должны использовать string carrierCode
вместо carrierCode.ToString()
. Защищает вас от NRE и выглядит более функционально для дополнительного бонуса: -)