要求:
n
开始的a
个连续数字列表。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;
答案 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)
问题可以描述为
n + 1
a
个连续数字
x
在范围内,请删除x
,否则从列表中删除最大数量转换为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);