在1到n中取m最近的L个数字,优先取m前面的,不够从后面补
例:1,2,3,4,5,6…n
n=10,m=6,L=3 取得:3,4,5
n=10,m=9,L=3 取得:6,7,8
n=10,m=4,L=3 取得:1,2,3
n=10,m=4,L=5 取得:1,2,3,5,6
n=3,m=3,L=3 取得:1,2
n=1,m=3,L=3 取得:1public int[] get(int n, int m, int L)
{
return Enumerable.Range(1, n).Where(i => i != m).Take(L).ToArray();
}
像这样子有时只取到m最前面的,加点什么条件可以取m最近的几个?
或者用有他方法..
例:1,2,3,4,5,6…n
n=10,m=6,L=3 取得:3,4,5
n=10,m=9,L=3 取得:6,7,8
n=10,m=4,L=3 取得:1,2,3
n=10,m=4,L=5 取得:1,2,3,5,6
n=3,m=3,L=3 取得:1,2
n=1,m=3,L=3 取得:1public int[] get(int n, int m, int L)
{
return Enumerable.Range(1, n).Where(i => i != m).Take(L).ToArray();
}
像这样子有时只取到m最前面的,加点什么条件可以取m最近的几个?
或者用有他方法..
不要偷懒了,linq不是万能的
//Linq 不是万能的 但是LINQ是实现起来最优雅的
public int[] get(int n, int m, int L)
{
return (from x in Enumerable.Range(1, n)
let y=m-x
where y>0
orderby y
select x).Take(L).ToArray();
}
public int[] get(int n, int m, int L)
{
var query= (from x in Enumerable.Range(1, n)
let y=m-x
where y>0
orderby y
select x).Take(L);
int count=query.Count();
if(count<L)
{
query=query.Concat( (from x in Enumerable.Range(1, n)
let y=x-m
where y>0
orderby y
select x).Take(L-count));
}
return query.ToArray();
}
public static int[] get(int n, int m, int L)
{
int count = Enumerable.Range(1, n).Where(i => i < m).Count();
if (count < L)
return Enumerable.Range(1, n).Where(i => i != m).Take(L).ToArray();
else
{
int count1=count;
int loop;
for (loop = 0; count1 >= L; )
{
count1 -= L;
loop++;
}
return Enumerable.Range(1, n).Where(i => i != m).Skip((loop-1)*L +count%L) .Take(L).ToArray();
}
}
支持,LinQ to Object 还是非常不错的。