按照简单模式初始化N个数组的最简单方法是什么?

时间:2008-09-15 22:04:53

标签: c#

假设前9个整数可以从9开始整除3。

我确定有一些使用lambdas的单行解决方案,我只是不太清楚它的语言区域。

7 个答案:

答案 0 :(得分:5)

使用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();

答案 1 :(得分:5)

只是为了与众不同(并避免使用where语句),你也可以这样做:

var numbers = Enumerable.Range(0, n).Select(i => i * 3 + 9);

更新这也有不会耗尽数字的好处。

答案 2 :(得分:1)

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();

答案 3 :(得分:1)

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();

答案 4 :(得分:1)

我想看看这个解决方案如何叠加到上面的Linq解决方案。这里的技巧是使用从(q % m)开始的s集合为(s + (s % m) + m*n)(其中n表示集合中的第n个值)这一事实来修改谓词。在我们的案例中s=q

此解决方案的唯一问题是它具有使您的实现取决于您选择的特定模式的副作用(并非所有模式都具有合适的谓词)。但它具有优点

  1. 始终在n次迭代中运行
  2. 永远不会像上面提出的解决方案那样失败(对于有限的Range)。
  3. 此外,无论您选择何种模式,您始终都需要修改谓词,因此您可以在数学上使其有效:

    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)一起使用。再次注意我修改了谓词,但你也可以用大多数简单的模式来做到这一点。

答案 5 :(得分:0)

我不能说这有什么好处,我不是C#专家,我只是把它搞砸了,但我认为这可能是使用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++;
  }
}

答案 6 :(得分:0)

您必须迭代0或1到N并手动添加它们。或者,您可以创建函数f(int n),并在该函数中,将结果缓存在会话或全局哈希表或字典中。

伪代码,其中ht是全局Hashtable或Dictionary(强烈建议使用后者,因为它是强类型的。

public int f(int n)
{
  if(ht[n].containsValue)
    return ht[n];
  else
  {
    //do calculation
    ht[n] = result;
    return result;
   }
}

只是旁注。如果你一直在进行这种类型的函数式编程,你可能想要查看F#,甚至是Iron Ruby或Python。