无限重复列表(用无限重复序列压缩有限列表)
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()
或这样 :-):
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()
或这样 :-):