gpt4 book ai didi

c# - 无限重复列表(用无限重复序列压缩有限列表)

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

UserList 是字典列表,例如:

[
{Name:"Alex",Age:25},
{Name:"Peter",Age:35},
{Name:"Muhammad",Age:28},
{Name:"Raul",Age:29}
]

RowColorList 是颜色列表:[#bcf,#fc0]

新的 UserList 应该为每个名称包含一个 RowColor,从 RowColorList 中按顺序获取:

[
{Name:"Alex",Age:25,RowColor:#bcf},
{Name:"Peter",Age:35,RowColor:#fc0},
{Name:"Muhammad",Age:28,RowColor:#bcf},
{Name:"Raul",Age:29,RowColor:#fc0}
]

我尝试了以下代码:

UserList.Zip(RowColorList,(user,color) => user.Add("RowColor",color))

使用此代码,新的 UserList 将只包含与 RowColorList 中一样多的条目。每当可用颜色用完时,我希望他再次从 RowColorList 的开头开始。怎么办?

最佳答案

您可以通过使用yield return 作为惰性生成器:

public IEnumerable<Color> InfiniteColors()
{
while (true)
{
foreach (var color in RowColors)
{
yield return color;
}
}
}

这可以与任何 Linq IEnumerable 扩展方法一起使用,例如 Zip

UserList.Zip(InfiniteColors(),(user,color) => user.Add("RowColor",color))

编辑 - 解释

InfiniteColors 没有挂起的原因是因为状态机会在每个结果后返回给调用者,而 Zip 会在第一个可枚举完成时终止,这是因为另一个集合被压缩是有限的(即 UserList)

显然,您不应该尝试 Zip 可枚举的 InfiniteColors,也不应该尝试具体化 InfiniteColors,即不要调用 InfiniteColors.ToList() 或类似的 :-):

关于c# - 无限重复列表(用无限重复序列压缩有限列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108086/

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