创建一个不包括一个数字的序列号列表

时间:2015-11-07 00:54:04

标签: c# linq

要求:

  1. 创建从n开始的a个连续数字列表。
  2. 排除号码x
  3. 这是我现在最好的,问题是如果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.

6 个答案:

答案 0 :(得分:4)

怎么样

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

答案 1 :(得分: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的答案会更好。

答案 2 :(得分:1)

问题可以描述为

  1. n + 1
  2. 开始获取a个连续数字
  3. 如果x在范围内,请删除x,否则从列表中删除最大数量
  4. 转换为C#

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

答案 3 :(得分: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();

答案 4 :(得分: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

答案 5 :(得分: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);