C#GroupBy、Sum、Select組合使用

  List<MesStock> result = new List<MesStock>();

            mesStocks.GroupBy(x => new { x.Deid, x.Pno, x.Sno }, (x, y) =>
            {
                var total = y.Sum(a => a.TotalNums);
                var res = y.Select(stock =>
                {
                    stock.TotalNums = total;
                    return stock;
                }).ToList();
                result.Add(res.First());
                return res;
            }).ToList();

  測試代碼:

 static void Main(string[] args)
        {
            var test = new List<MesStock> {
                new MesStock { Deid="1",Pno="1",Sno="1",TotalNums=1},
                new MesStock { Deid="1",Pno="1",Sno="1",TotalNums=1},
                new MesStock { Deid="1",Pno="1",Sno="1",TotalNums=11},
                new MesStock {Deid="2",Pno="2",Sno="2",TotalNums=2},
                new MesStock {Deid="2",Pno="2",Sno="2",TotalNums=2},
                new MesStock {Deid="2",Pno="2",Sno="2",TotalNums=33},
                new MesStock {Deid="3",Pno="3",Sno="3",TotalNums=3},
            };
            List<MesStock> res = new List<MesStock>();

            test.GroupBy(x => x.Deid + x.Pno + x.Sno, (x, y) =>
             {
                 var total = y.Sum(a => a.TotalNums);
                 var tt = y.Select(t =>
                 {
                     t.TotalNums = total;
                     return t;
                 }).ToList();
                 res.Add(tt.First());
                 return tt;
             }).ToList();
     
            foreach (var item in res)
            {
                
               Console.WriteLine(item.TotalNums);
            }
        }

  

 public static class GroupHelper
    {
        public static List<List<object>> Group(this List<object> source, Func<List<object>, bool> limitFunc)
        {
            return Group<object>(source, limitFunc);
        }
        public static List<List<T>> Group<T>(this List<T> source, Func<List<T>, bool> limitFunc)
        {
            var result = new List<List<T>>();
            List<T> resItem = null;
            var inter = source.GetEnumerator();
            foreach (var item in source)
            {
                if (resItem == null) resItem = new List<T>();
                resItem.Add(item);
                if (limitFunc(resItem.ToList()))
                {
                    resItem.Remove(item);
                    result.Add(resItem);
                    resItem = new List<T> { item };
                }
            }
            return result;
        }

        public class t
        {
            public string key { get; set; }
        }
        public static object test()
        {
            var list = new List<t> {
                new t { key = "b" }, new t { key = "c" },new t { key = "b" },
                new t { key = "a" },new t { key = "c" },new t { key = "e6" }, new t { key = "e9" }, new t { key = "c" },
                new t { key = "e1" }, new t { key = "e4" },new t { key = "e7" },new t { key = "e10" },
                 new t { key = "b" },new t { key = "e5" },new t { key = "e8" },new t { key = "e11" },
                new t { key = "e3" },  new t { key = "e13" },new t { key = "a" },new t { key = "e2" },new t { key = "e12" },
            };
            var res = list.GroupBy(m => m.key).OrderByDescending(m => m.Count()).SelectMany(m => m).ToList();
            return res.Select(m => m.key);
            //"b", "b", "b", "c", "c", "c", "a", "a", "e6", "e9", "e1", "e4", "e7", "e10", "e5", "e8", "e11", "e3", "e13", "e2", "e12"
            //var source = "a a b b b c c c d d e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12 e13".Split(' ').ToList();
            //var groups = source.Group(r => (!(r.Count == 2 && r.Distinct().Count() == 2) && r.Count > 1 && r.Distinct().Count() == 2) || (r.Count == 13 && r.Distinct().Count() == 13));
            //return groups;
            //result:
            //aa
            //bbb
            //ccc
            //dd
            //e1-e12
            //e13
        }
    }

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章