2008-09-15 33 views

回答

5

只要是不同的(並且避免使用WHERE語句),你也可以這樣做:

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

更新這也還沒有用完數字的利益。

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++; 
    } 
} 
0

你必須遍歷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#,甚至可能在鐵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(); 

如果需要還可以輕鬆parallelizeable使用PLINQ:

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

這個解決方案的唯一問題是它具有使您的實現取決於您選擇的特定模式(並非所有模式都有合適的謂詞)的副作用。但它具有優勢

  1. 恰好n次迭代
  2. 永不失敗像上面提出的解決方案始終運行(WRT有限的Range)。

此外,無論你選擇什麼樣的模式,你將永遠需要修改謂語,所以你還不如讓數學高效:

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)使用它。再次請注意,我修改了謂詞,但您也可以使用最簡單的模式來完成此操作。

相關問題