创建一个不包括一个数字的序列号列表
本文关键字:一个 序列号 列表 不包括 创建 数字 | 更新日期: 2023-09-27 18:20:52
要求:
- 创建一个从
a
开始的n
序列号列表 - 不包括编号
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的答案会更好。
问题可以描述为
- 从
a
开始获取n + 1
序列号 - 如果
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);