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

Repeat list endlessly (Zip a finite list with an Infinite repeating sequence)

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 的开头开始。怎么样?

像这样应该可以解决问题:

var i = 0;
var l = RowColorList.Count;
UserList.ForEach(user => user.Add("RowColor", RowColorList[(i++) % l]));

The % operator 将保证 "cyclic" 访问 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() 或这样 :-):