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

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

最佳答案

您可以通过使用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/

相关文章:

c# - Expression.Assign 返回 Func 而不是 Action

c# - 如何使用 Entity Framework 6 选择包含字符串中任何单词的项目?

c# - 如何将组中的元素拆分为多个列表?

c# - 哪种模型使用 linq、外键关系或本地列表最快?

c# - 在 SQL 或 C# 中对列求和

c# - 从 HttpClient 实例访问 HttpClientHandler?

c# - 如何打开列表框中显示的文件?

c# - 如何强制我的 lambda 表达式提前求值?修复 lambda 表达式的怪异问题?

c# - Linq to SQL Join 在我不想要的时候允许空值

c# - 从此 XML 标记中提取选定节点值的方法