C# init float数组使用Linq每x次递增索引值
初始化大小为n的浮点数组(使用linq每x索引递增一次)的最有效方法是什么 例如,若数组增量为5,从10开始,增量大小为5,则数组如下所示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 =>
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()
执行此操作。逻辑是这样的
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()
执行此操作。逻辑是这样的
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序列是无法做到这一点的。但是你的解决方案看起来很好,非常,非常可读。(顺便说一句,也很好地解释了。)