gpt4 book ai didi

c# - 使用最后一个元素扩展列表以匹配 LINQ zip 中更长的列表

转载 作者:太空狗 更新时间:2023-10-30 00:18:52 26 4
gpt4 key购买 nike

我有两个集合:

p = [ a, b ]
v = [ 1, 2, 3, 4, 5 ]

我想处理以下元组:

[ [a,1], [b,2], [b,3], [b,4], [b,5] ]

我当前的代码是:

p.zip(v, (x,y) => { ... })

当然我最终只处理:

[ [a,1], [b,2] ]

感觉我想创建一个 last(p) 的无限列表,由 p 覆盖,然后我们用 v 压缩它。像这样:

extend(p).zip( v, ... )

extend(IEnumerable list) 返回的地方

[ a, b, b, b, ..., b ] // Infinite/generated sequence

我想我可以将 extend() 编写为列表上的枚举器,当用尽时,它会无限返回最后一个元素。

我感兴趣的是,是否存在通过组合现有函数来创建扩展的函数式方法。我很高兴看到它用 Haskell/F# 表示,即使这些函数在 LINQ 中不存在。我鼓励自己从功能上思考。

我已经看过 https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-List.html对于可能的原子,但看不到任何可能创造我需要的东西。

谢谢!

编辑:

我进一步简化了问题:

extend(list) = list.Concat( repeat(list.Last()) )

where repeat(T item) returns [ item, item, ..., item ]

我现在正在 LINQ 和 Haskell 中搜索“重复”之类的现有实现。

最佳答案

Haskell 中的一个解决方案:

> let extend = foldr (\x xs -> x : if null xs then repeat x else xs) [] 

一些测试:

> extend []
[]
> take 10 $ extend [1]
[1,1,1,1,1,1,1,1,1,1]
> take 10 $ extend [1,2,3]
[1,2,3,3,3,3,3,3,3,3]

上面没有使用last,所以我们不会持有对整个输入列表的引用来extend——这样它就可以被垃圾收集。

当然,显式递归也可以:

extend :: [a] -> [a]
extend [] = []
extend [x] = repeat x
extend (x:xs) = x : extend xs

关于c# - 使用最后一个元素扩展列表以匹配 LINQ zip 中更长的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com