在c#Linq中反聚合列表

在c#Linq中反聚合列表,c#,linq,C#,Linq,鉴于以下情况 class MyClass { public int Id { get; set; } public int Value { get; set; } } var list = new List<MyClass>() { new MyClass { Id = 1, Value = 3 }, new MyClass { Id = 2, Value = 4 }, }; 我基本上是在重复Id,n*值 在Linq中有什么简单的方法可以做到这一点吗?您可以做到

鉴于以下情况

class MyClass 
{
  public int Id { get; set; }
  public int Value { get; set; } 
}
var list = new List<MyClass>() {
  new MyClass { Id = 1, Value = 3 },
  new MyClass { Id = 2, Value = 4 },
};
我基本上是在重复Id,n*值

在Linq中有什么简单的方法可以做到这一点吗?

您可以做到:

var array = list
    .SelectMany(c => Enumerable.Range(0, c.Value).Select(i => c.Id))
    .ToArray();
注:

  • 对于
    MyClass
    列表中的每个项目,生成指定范围内的整数序列-在本例中,从
    0
    开始,计数为
    MyClass.Value
    。然后将范围中的每个值投影为一个常量值,即
    MyClass.Id

  • 然后用于将可枚举的常量值展平到单个列表中

示例。

尝试以下方法:

var result = list.SelectMany(x => Enumerable.Repeat(x.Id, x.Value)).ToArray();

也许吧,但输入与输出的关系究竟如何?你认为1和2是从哪里来的?@NightOwl888:看起来,它应该重复
Id
次。是的,它重复Id值的时间数这是我喜欢
重复
更多的罕见情况之一。因为它工作(值类型)并且正是OP想要做的。“所以它更具可读性和简洁性。”蒂姆施梅尔特-是的,我想我同意。我很少使用它,以至于忘了它。但两者都很好。你能把你的邮递员给我吗?
var result = list.SelectMany(x => Enumerable.Repeat(x.Id, x.Value)).ToArray();