日期:2014-05-20  浏览次数:20753 次

求如何通过LINQ获取整数列表中各连续数列中第一元素与个数表
如有:List<int> ints=new List<int>{10,100,101,102,150,300,301};
通过LINQ方法查询,而得到结果如:{100,2},{300,1}
意为在ints整数列表中,以元素100为首的连续数有2个,即101和102;以元素300为首的连续数有1个,即301.


------解决方案--------------------
这个用Aggregate即可实现:

http://blog.csdn.net/q107770540/article/details/6625243
------解决方案--------------------
好像需求不是很明确的样子。
------解决方案--------------------
探讨

还不明确呀?既有说明,也有示例,我都不知道应该怎么说才能说的再明确些了,晕!

------解决方案--------------------
C# code

void Main()
{
    List<int> ints=new List<int>{10,100,101,102,150,300,301};
    var list=ints.OrderBy(i=>i).ToList();
    var temp=new List<List<int>>(); 
      var query=list.Aggregate((m,n)=>  
      {   
             if(temp.Count()>0)
             {
                if(temp.Last().Last()==n-1)
                {
                    temp.Last().Add(n);
                }
                else if(m==n-1)
                {
                    temp.Add(new List<int>{m,n});   
                } 
             }
             else
             {
               if(m==n-1)
                {
                    temp.Add(new List<int>{m,n});   
                } 
             } 
            return n;  
      }  
    );  
    var result=from t in temp 
               select new {Key=t.First(),Count=t.Count()-1};
    result.ToList().ForEach(r=>Console.WriteLine("{0}\t{1}",r.Key,r.Count));
    /*
    100    2
    300    1
    */
}

------解决方案--------------------
C# code

            var list1 = new List<int>();
            int temp = 0;
            var query = intss.Select(ints =>
                                           {
                                               list1 = new List<int>();
                                               ints.Aggregate((s, n) =>
                                               {
                                                   if ((s + 1) == n)
                                                   {
                                                       if (temp == 0)
                                                           temp = s;
                                                       list1.Add(temp);
                                                   }
                                                   else
                                                   {
                                                       temp = 0;
                                                   }

                                                   return n;
                                               });
                                               return list1.GroupBy(g => g).Select(s => new { key = s.Key, count = s.Count() });
                                           });
            foreach (var item in query)
                Console.WriteLine(string.Join("", item.Select(s => string.Format("[{0},{1}]", s.key, s.count)).ToArray()));