在 Elixir 中实现外/内循环的最佳方式
Best way to implement outer / inner loop in Elixir
在 Elixir 中实现以下代码的最佳/正确方法是什么:
foreach( var item in items) {
foreach(var num in get_nums_from(item)) {
yield return is_valid(num) ? num : -1;
} }
非常感谢。
循环的自由翻译如下:
Enum.flat_map(items, fn (item) ->
Enum.map(get_nums_from(item), fn (num) ->
if is_valid?(num), do: num, else: -1
end)
end)
如果您还想保留迭代的惰性特征(我认为 .net 版本会有),您需要改用 Stream,以创建惰性序列:
Stream.flat_map(items, fn (item) ->
Stream.map(get_nums_from(item), fn (num) ->
if is_valid?(num), do: num, else: -1
end)
end)
另一种方法,假设懒惰不是必需的,是列表理解:
for item <- items, num <- get_nums_from(item) do
if is_valid?(num), do: num, else: -1
end
Bitwalker 的回答很好地回答了您的问题;然而,你用这些做什么
-1s?如果您稍后要过滤掉它们,请考虑一些事情
喜欢:
for i <- items, num <- get_nums_from(item), is_valid?(num), do: num
在可执行方面看起来像
iex(2)> for i <- [[1,2,3],[4,5,6],[7,8,9]], j <- i, rem(j, 2) == 0, do: j
[2, 4, 6, 8]
或者看看枚举。filter/2。
在 Elixir 中实现以下代码的最佳/正确方法是什么:
foreach( var item in items) {
foreach(var num in get_nums_from(item)) {
yield return is_valid(num) ? num : -1;
} }
非常感谢。
循环的自由翻译如下:
Enum.flat_map(items, fn (item) ->
Enum.map(get_nums_from(item), fn (num) ->
if is_valid?(num), do: num, else: -1
end)
end)
如果您还想保留迭代的惰性特征(我认为 .net 版本会有),您需要改用 Stream,以创建惰性序列:
Stream.flat_map(items, fn (item) ->
Stream.map(get_nums_from(item), fn (num) ->
if is_valid?(num), do: num, else: -1
end)
end)
另一种方法,假设懒惰不是必需的,是列表理解:
for item <- items, num <- get_nums_from(item) do
if is_valid?(num), do: num, else: -1
end
Bitwalker 的回答很好地回答了您的问题;然而,你用这些做什么 -1s?如果您稍后要过滤掉它们,请考虑一些事情 喜欢:
for i <- items, num <- get_nums_from(item), is_valid?(num), do: num
在可执行方面看起来像
iex(2)> for i <- [[1,2,3],[4,5,6],[7,8,9]], j <- i, rem(j, 2) == 0, do: j
[2, 4, 6, 8]
或者看看枚举。filter/2。