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

本文关键字:一个 序列号 列表 不包括 创建 数字 | 更新日期: 2023-09-27 18:20:52

要求:

  1. 创建一个从a开始的n序列号列表
  2. 不包括编号x

这是我现在最好的,问题是如果x不在范围内,它会创建n + 1数字。

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;

这里有一个Fiddle演示了Mark的答案。

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

怎么样

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

我的例子,如何在没有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的答案会更好。

问题可以描述为

  1. a开始获取n + 1序列号
  2. 如果x在该范围内,则删除x,否则从列表中删除最大数量

翻译成C#

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

只生成必要的值而不是生成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

如果可枚举计数大于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();

我不知道真正的挑战是什么——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);