2008-12-16 149 views
3

在F#中,您可以通過說[1..100]來生成一組數字。在C#中生成整數集合#

我想在C#中做類似的事情。這是我想出迄今:

public static int[] To(this int start, int end) 
{ 
    var result = new List<int>(); 
    for(int i = start; i <= end; i++) 
     result.Add(i); 
    return result.ToArray(); 
} 

通過這樣做,我現在可以說1.To(100)

不幸的是,這是不是幾乎一樣可讀打造集[ 1..100]。有沒有人想出了一個更好的方式在C#中做到這一點?如果它是小寫,它更具可讀性嗎? 1.to(100),例如?或者,「是」是一個壞詞?有點像1.Through(100)更具可讀性?

只是尋找一些想法。有沒有人想出更優雅的解決方案?

編輯:

public static int[] To(this int start, int end) 
{ 
    return Enumerable.Range(start, end - start + 1).ToArray(); 
} 

我現在還在找工作的想法在1.To(100)

的可讀性:
閱讀的答覆後,我一直在使用的範圍內重新寫了我的方法
+0

你有特定的需求來創建一個數組而不是IEnumerable ?如果是的話,我很好奇你的理由是什麼。 – joshperry 2010-04-15 20:27:38

回答

8

Enumerable.Range(1,100);

+0

該方法很有用。謝謝。它比1.To(100)更不可讀,但我至少可以在實現中使用To()。 – 2008-12-16 13:09:27

+0

我應該展開爲什麼我認爲它不太可讀......這是因爲我實際上需要一個數組,它變成:Enumerable.Range(1,100).ToArray() – 2008-12-16 13:12:26

+0

我會說1.To(100)可能會被誤解。對我來說,這聽起來像一個演員。 Enumerable.Range具有在.net框架中實現的優點,因此可能會爲更多人所熟悉。 – terjetyl 2008-12-16 13:42:22

0

你可以看看涉及枚舉數和yield聲明的內容嗎?

0

我認爲類似Set(1,100)IntSequence(1,100)比使用擴展方法更容易閱讀。

個人意見,但...

5

我喜歡用To的想法。替代品Enumerable.Range有一個微妙的缺陷。第二個參數是不是的最後一個元素,它是的長度的枚舉。這是我在過去所做的那樣:

public IEnumerable<int> To(this int start, int stop) 
{ 
    while (start <= stop) 
    yield return start++; 
} 

編輯:如果你想要的結果作爲int[],只需添加.ToArray()

int[] theSet = 1.To(100).ToArray(); 
0

你回答你自己的問題是好的。如果你關心性能,就不要使用List。建立一個清單並不斷擴大它是愚蠢的。只需構建一個適當大小的數組。使用擴展方法

public static int[] To(this int num) 
    { 
     //do work 
    } 
0

我覺得你太擔心語言不能完全表達你想要的特定語法。

我看到它的方式,擴展方法是一個很好的糖,但我不知道你是否真的用它來證明擴展方法的「驚喜」。

在C#語言的範圍內,通過方法名稱拼出您正在嘗試執行的操作更爲合適。這比Ruby感覺更像Ruby。這種感覺更像是希望自己上課,特別是如果你想添加跳躍模式的範圍(即三分之一從1到10的數字)。我認爲

public class RangedArray { 
    public static int[] Generate(int from, into to, int by=1) { /* ... */ } 
} 

是完全可以用C#表達這個。