2008-09-15 8 views

答えて

5

だけ異なるように(どこのステートメントを使用しないように)あなたも行うことができます:

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

更新これも数字が不足していないという利点があります。

0

これはいいとは言えませんが、私はC#のエキスパートではありません。ちょうどそれを叩きましたが、おそらくyieldの標準的な例だと思います。

0

Nに0または1を反復して手作業で追加する必要があります。または、関数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#、または多分鉄のRubyやPythonをチェックアウトする場合があります

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

LINQの使用:。

int[] numbers = 
    Enumerable.Range(9,10000) 
    .Where(x => x % 3 == 0) 
    .Take(20) 
    .ToArray(); 

PLINQを使用しても簡単にparallelizeableあなたが必要な場合:

int[] numbers = 
    Enumerable.Range(9,10000) 
    .AsParallel()    //added this line 
    .Where(x => x % 3 == 0) 
    .Take(20) 
    .ToArray(); 
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(); 
0

私は、このソリューションは、上記のLINQのソリューションまでスタックか見てみたいです。ここでのトリックは、sから始まる(q % m)のセットが(s + (s % m) + m*n)(nはセットのn番目の値を表す)であるという事実を使用して述語を修正しています。私たちの場合s=q

このソリューションの唯一の問題は、選択した特定のパターンに基づいて実装を行うという副作用があることです(すべてのパターンに適切な述語があるわけではありません)。 (限られたRangeにWRT)

  1. は常に正確にn回の反復
  2. 決して上記の提案された解決策のように失敗しないで実行されている。しかし、それはのがという利点があります。

はまた、関係なく、あなたが何を選ぶかのパターン、あなたは常に述語を変更する必要はありませんので、あなたにも、それは数学的に効率的になるかもしれない:

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)でそれを使用することができます。もう一度述語を修正しましたが、ほとんどの単純なパターンでもこれを行うことができます。