在c#Linq中分解列表

时间:2017-10-06 08:58:41

标签: 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 },
};

我想把它变成以下数组

var list = int[] { 1,1,1,2,2,2,2 };

我基本上重复了Id,n * Value。

在Linq有没有简单的方法呢?

2 个答案:

答案 0 :(得分:8)

试试这个:

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

.Net Fiddle

答案 1 :(得分:3)

你可以这样做:

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

注意:

  • 对于MyClass列表中的每个项目,Enumerable.Range()会在指定范围内生成一系列整数 - 在这种情况下,从0开始并且计数为{ {1}}。然后将范围中的每个值投影到一个常数值,即MyClass.Value

  • 然后使用
  • Enumerable.SelectMany()将可枚举的常量值展平为单个列表。

示例fiddle