2015-12-19 42 views
2

假設我有兩點,int x1, x2,其中x1可以更大,更小或等於x2。我想要在這兩個點之間生成所有整數(從x1開始並以x2結尾),或者如果兩個點相等,則只需要x1。有沒有什麼優雅的方式來產生這些值IEnumerable<int>更好的Enumerable.Range升序和降序範圍?

+2

沒有內置。聚合可以做到這一點,但它會矯枉過正。製作你自己的,它不應該超過5行。 –

回答

8

你可以使用這個迭代器塊:

IEnumerable<int> CreateRange(int x1, int x2) { 
    var increment = x2 > x1 ? 1 : -1; 
    for (var i = x1; i != x2; i += increment) 
    yield return i; 
    yield return x2; 
} 

它的高效和創建範圍是一樣乾淨使用Enumerable.Range

CreateRange(10, 5).Select(...) 
+0

我想保留訂單 – user2341923

+0

什麼命令? @ user2341923 – dotctor

+0

以'x1'開頭並以'x2'結尾,即使'x1> x2' – user2341923

3

你可以做這樣的事情:

//normal order works 
int x1 = 5; 
int x2 = 10; 
int len = Math.Abs(x2 - x1) + 1; 

var range = x1 < x2 ? Enumerable.Range(x1, len) : Enumerable.Range(x2, len).Reverse(); 

//reverse order works (the same code for range) 
x1 = 10; 
x2 = 5; 
len = Math.Abs(x2 - x1) + 1; 

range = x1 < x2 ? Enumerable.Range(x1, len) : Enumerable.Range(x2, len).Reverse(); 
4

如果你想堅持單一的LINQ語句 -

Enumerable.Range(0, Math.Abs(x2 - x1) + 1).Select(i => x1 + i * Math.Sign(x2 - x1))