2015-11-07 60 views
0

要求的列表:創建序列號,不包括一個數

  1. 創建開始an序列號的列表。
  2. 排除號碼x

這是我現在最好的,問題是它創建n + 1數字,如果x不在範圍內。

var numbers = Enumerable 
    .Range(a, numberOfDataRowsToAdd + 1) 
    .Where(i => i != TechnicalHeaderRowIndex); 

例1應產生0,1,2,3,4,5,6,7,8,9

var a = 0; 
var n = 10; 
var x = 11; 

例2應產生0,1,2,3,4,5,7,8,9,10

var a = 0; 
var n = 10; 
var x = 6; 

Here is a Fiddle that demonstrates Mark's answer.

+2

兩個例子,儘管'N'爲​​10 –

+0

@MarkSowul捕獲列表11號。不確定我是否應該編輯該問題。雖然我這樣做,因爲它似乎沒有影響到答案。 –

回答

4

如何

Enumerable.Range(a, n + 1) 
      .Where(i => i != x) 
      .Take(n); 
2

我的例子,怎麼可以不LINQ和額外的循環迭代完成:

public static IEnumerable<int> GenerateNumbers(int a, int n, int x) 
{ 
    for (var i = 0; i < n; i++) 
    { 
     if (a == x) 
     { 
      i--; 
      a++; 
      continue; 
     } 
     yield return a++; 
    } 
} 

但是,如果你不想爲此目的創造新的方法,Mark Sowul或Jakub Lortz的答案會更好。

0

您可以掛斷最後,如果你的枚舉計數大於numberOfDataRowsToAdd

擴展方法:

public static IEnumerable<T> DropLast<T>(this IEnumerable<T> enumerable) 
{ 
    return enumerable.Take(enumerable.Count()-1); 
} 

用法:

var numbers = Enumerable 
    .Range(a, numberOfDataRowsToAdd + 1) 
    .Where(i => i != TechnicalHeaderRowIndex); 

if(numbers.Count() > numberOfDataRowsToAdd) 
    numbers = numbers.DropLast(); 
1

問題可以描述爲

  1. 獲取n + 1序列號從a
  2. 如果x是在範圍開始,除去x,否則從列表中

翻譯成C#

int numberToExclude = Math.Min(n + a, x); 
var numbers = Enumerable.Range(a, n + 1).Where(i => i != numberToExclude); 
0

這是有道理的產生刪除的最大數量只有必要的值而不生成n + 1值,然後刪除x

Enumerable.Range(a, n).Select(i => i < x ? i : i + 1); 

實施例1:0,1,2,3,4,5,6,7,8,9
實施例2:0,1,2,3,4,5,7,8,9,10

0

我不明白什麼是真正的挑戰 - Linq最短或最快或只是工作。如何自然(這也應該是最快的LINQ爲主)

var numbers = a <= x && x < a + n ? 
    Enumerable.Range(a, x - a).Concat(Enumerable.Range(x + 1, a - x + n)) : 
    Enumarble.Range(a, n);