按照简单模式初始化N个数字数组的最简单方法是什么?
时间:2020-03-05 18:54:40 来源:igfitidea点击:
假设前N个整数可以从9开始被3整除。
我敢肯定,有一些使用lambda的解决方案,我只是不太了解该语言领域。
解决方案
回答
我不能说这有什么用,我不是Cexpert,我只是把它搞砸了,但是我认为这可能是使用yield的典型例子。
internal IEnumerable Answer(N) { int n=0; int i=9; while (true) { if (i % 3 == 0) { n++; yield return i; } if (n>=N) return; i++; } }
回答
我们必须遍历0或者1到N,然后手动添加它们。或者,我们可以只创建函数f(int n),然后在该函数中将结果缓存在会话或者全局哈希表或者字典中。
伪代码,其中ht是全局哈希表或者字典(强烈建议使用后者,因为它是强类型的。
public int f(int n) { if(ht[n].containsValue) return ht[n]; else { //do calculation ht[n] = result; return result; } }
只是一个旁注。如果我们一直都在进行这种类型的功能编程,则可能需要检出F#,或者甚至是Iron Ruby或者Python。
回答
const int __N = 100; const int __start = 9; const int __divisibleBy = 3; var array = Enumerable.Range(__start, __N * __divisibleBy).Where(x => x % __divisibleBy == 0).Take(__N).ToArray();
回答
使用Linq:
int[] numbers = Enumerable.Range(9,10000) .Where(x => x % 3 == 0) .Take(20) .ToArray();
如果需要,还可以使用PLinq轻松并行化:
int[] numbers = Enumerable.Range(9,10000) .AsParallel() //added this line .Where(x => x % 3 == 0) .Take(20) .ToArray();
回答
int n = 10; // Take first 10 that meet criteria int[] ia = Enumerable .Range(0,999) .Where(a => a % 3 == 0 && a.ToString()[0] == '9') .Take(n) .ToArray();
回答
我想看看这个解决方案如何与上述Linq解决方案相结合。这里的技巧是利用以下事实来修改谓词,即从(s)开始的({q%m)`的集合是((s +(s%m)+ m * n))(其中n代表in集合)。在我们的例子中,是s = q。
该解决方案的唯一问题是,它的副作用是使实现取决于我们选择的特定模式(并非所有模式都有合适的谓词)。但是它具有以下优点:
- 始终在准确的n次迭代中运行
- 永远不会像上述建议的解决方案那样失败(改写为有限的"范围")。
此外,无论我们选择哪种模式,都将始终需要修改谓词,因此我们可能还需要使其在数学上有效:
static int[] givemeN(int n) { const int baseVal = 9; const int modVal = 3; int i = 0; return Array.ConvertAll<int, int>( new int[n], new Converter<int, int>( x => baseVal + (baseVal % modVal) + ((i++) * modVal) )); }
编辑:我只想说明我们如何将这种方法与delegate
一起使用以改善代码重用:
static int[] givemeN(int n, Func<int, int> func) { int i = 0; return Array.ConvertAll<int, int>(new int[n], new Converter<int, int>(a => func(i++))); }
我们可以将其与givemeN(5,i => 9 + 3 * i)
一起使用。再次注意,我修改了谓词,但是我们也可以使用最简单的模式来执行此操作。
回答
只是有所不同(并避免使用where语句),我们还可以这样做:
var numbers = Enumerable.Range(0, n).Select(i => i * 3 + 9);
更新这还有一个好处,就是数字不会用完。