无休止地重复列表(使用无限重复序列压缩有限列表)

时间:2015-01-23 10:42:38

标签: c# linq

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

2 个答案:

答案 0 :(得分:6)

您可以创建一个函数来返回Color / string的无限可枚举(或RowColor的任何类型)

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))

答案 1 :(得分:3)

这样的事情可以解决问题:

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

The % operator将保证&#34;循环&#34;访问RowColorList。