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/