在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.   

    貌似LZ在取分页中要显示的页码。。
    不要偷懒了,linq不是万能的
      

  2.   


    //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();
    }
      

  3.   


    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();
    }
      

  4.   

    拜读楼上,我这个方法也实现了,但没楼上好
    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();
                }
            }
      

  5.   


    支持,LinQ to Object 还是非常不错的。