C# init float数组使用Linq每x次递增索引值

C# init float数组使用Linq每x次递增索引值,c#,arrays,linq,C#,Arrays,Linq,初始化大小为n的浮点数组(使用linq每x索引递增一次)的最有效方法是什么 例如,若数组增量为5,从10开始,增量大小为5,则数组如下所示 float[]x={10,10,10,10,15,15,15,15,20,20,20,20,25,25,25,25}这个怎么样: var n = 20; var start = 10; var step = 5; var increment = 5; var x = Enumerable .Range(0, n) .Select(y =>

初始化大小为n的浮点数组(使用linq每x索引递增一次)的最有效方法是什么

例如,若数组增量为5,从10开始,增量大小为5,则数组如下所示

float[]x={10,10,10,10,15,15,15,15,20,20,20,20,25,25,25,25}

这个怎么样:

var n = 20;
var start = 10;
var step = 5;
var increment = 5;
var x = Enumerable
    .Range(0, n)
    .Select(y => (float)start + increment * (y / step))
    .ToArray();
请注意,尽管我非常喜欢Linq,但我必须同意Robert Harvey的观点,即在这种情况下,循环可能更清晰。

这个怎么样:

var n = 20;
var start = 10;
var step = 5;
var increment = 5;
var x = Enumerable
    .Range(0, n)
    .Select(y => (float)start + increment * (y / step))
    .ToArray();

请注意,尽管我非常喜欢Linq,但我必须同意Robert Harvey的观点,即在这种情况下,循环可能更清晰。

Linq可能不是解决此问题的最佳选择。话虽如此,也许是这样的

var groupCount = 4;
var elementsPerGroup = 5;
var increment = 5;

var a = Enumerable
    .Range(0, groupCount)
    .Select(i => Enumerable
                     .Range(0, elementsPerGroup)
                     .Select(r => (float)(10 + increment * i)).ToArray())
    .SelectMany(i => i)
    .ToArray();

Linq可能不是解决这个问题的最佳选择。话虽如此,也许是这样的

var groupCount = 4;
var elementsPerGroup = 5;
var increment = 5;

var a = Enumerable
    .Range(0, groupCount)
    .Select(i => Enumerable
                     .Range(0, elementsPerGroup)
                     .Select(r => (float)(10 + increment * i)).ToArray())
    .SelectMany(i => i)
    .ToArray();
你可以争论什么是“最佳”方式。我要怎么做就怎么做。首先,我将创建一个帮助器方法来帮助您生成枚举

公共静态IEnumerable展开(T种子,函数累加器){
var nextValue=种子;
while(true){
收益率下一个价值;
nextValue=累加器(nextValue);
}
}
这是一个通用的辅助函数。例如

Unfold(1, x => x*2)
它会创建一个新的IEnumerable,其中每个新数字都是前一个数字的两倍。您应该使用.Take()或.TakeWhile()方法来限制生成的数字量。例如,如果你只想要前10个数的二次幂

Unfold(1, x => x*2).Take(10).ToList()
您将得到一个带有
[1,2,4,8,16,32,64128256512]

类似于Unfold()的内容通常有助于创建任意枚举

现在创建您的列表。您希望创建一个始终添加5的列表。然后每个数字重复5次,你想重复4次。所以你的第一步是

Unfold(10, x => x+5).Take(4)
它将创建一个IEnumerable,其中包含
[10,15,20,25]
。现在,下一步是每5次重复一次

您可以使用
Enumerable.Repeat()
执行此操作。逻辑是这样的

  • 检查一下你的清单
  • 从每个具有Enuable的数字创建一个新的Enuable。重复
  • 将每个可枚举项平坦化为单个可枚举项
  • 上述逻辑正是SelectMany()所做的。因此,解决方案是

    var nums = Unfold(10, x => x+5).Take(4).SelectMany(x => Enumerable.Repeat(x, 5));
    
    现在
    nums
    是下面的列表
    [10,10,10,15,15,15,15,20,20,20,25,25,25,25,25]
    你可以争论什么是“最佳”方式。我要怎么做就怎么做。首先,我将创建一个帮助器方法来帮助您生成枚举

    公共静态IEnumerable展开(T种子,函数累加器){
    var nextValue=种子;
    while(true){
    收益率下一个价值;
    nextValue=累加器(nextValue);
    }
    }
    
    这是一个通用的辅助函数。例如

    Unfold(1, x => x*2)
    
    它会创建一个新的IEnumerable,其中每个新数字都是前一个数字的两倍。您应该使用.Take()或.TakeWhile()方法来限制生成的数字量。例如,如果你只想要前10个数的二次幂

    Unfold(1, x => x*2).Take(10).ToList()
    
    您将得到一个带有
    [1,2,4,8,16,32,64128256512]

    类似于Unfold()的内容通常有助于创建任意枚举

    现在创建您的列表。您希望创建一个始终添加5的列表。然后每个数字重复5次,你想重复4次。所以你的第一步是

    Unfold(10, x => x+5).Take(4)
    
    它将创建一个IEnumerable,其中包含
    [10,15,20,25]
    。现在,下一步是每5次重复一次

    您可以使用
    Enumerable.Repeat()
    执行此操作。逻辑是这样的

  • 检查一下你的清单
  • 从每个具有Enuable的数字创建一个新的Enuable。重复
  • 将每个可枚举项平坦化为单个可枚举项
  • 上述逻辑正是SelectMany()所做的。因此,解决方案是

    var nums = Unfold(10, x => x+5).Take(4).SelectMany(x => Enumerable.Repeat(x, 5));
    

    现在
    nums
    是下面的列表
    [10,10,10,10,15,15,15,15,20,20,20,25,25,25,25,25]它是如何在25中停止的?逻辑是什么?一个
    for
    循环可能更容易编写,也更容易理解,因为它是专门为完成您在问题中描述的任务而设计的。它如何在25分钟内停止?逻辑是什么?一个
    for
    循环可能更容易编写,也更容易理解,因为它是专门为实现您在问题中描述的功能而设计的。Linq-ishly是一个非常棒的答案。很像用大锤去除松动的牙齿。也许你也可以说,这只是“函数式编程”的方式。+1哇。我几乎预料到,在不牺牲可读性的情况下,使用Linq序列是无法做到这一点的。但是你的解决方案看起来很好,非常,非常可读。(顺便说一句,也很好地解释了…)林克的回答真是太棒了。很像用大锤去除松动的牙齿。也许你也可以说,这只是“函数式编程”的方式。+1哇。我几乎预料到,在不牺牲可读性的情况下,使用Linq序列是无法做到这一点的。但是你的解决方案看起来很好,非常,非常可读。(顺便说一句,也很好地解释了。)