List<A> alist = new List<A>{ new A{name="a1",a=11,b=12,c=13,d=14,e=15}, new A{name="a1",a=11,b=12,c=13,d=14,e=17}, new A{name="a1",a=11,b=13,c=13,d=14,e=17}, new A{name="a1",a=10,b=13,c=13,d=14,e=17}, new A{name="a1",a=10,b=13,c=13,d=14,e=17}, new A{name="a2",a=21,b=22,c=23,d=24,e=25}, new A{name="a3",a=31,b=32,c=33,d=34,e=35}, new A{name="a4",a=41,b=42,c=43,d=44,e=45}, new A{name="a5",a=51,b=52,c=53,d=54,e=55}, new A{name="a4",a=41,b=42,c=43,d=44,e=47}, new A{name="a5",a=51,b=52,c=53,d=54,e=57}, new A{name="a4",a=41,b=42,c=43,d=44,e=49}, new A{name="a5",a=51,b=52,c=53,d=54,e=59}, }; //分组求 Key 的和 var alistarr = alist.GroupBy(a => new { a.name, a.a, a.b, a.c, a.d }); // 根据分组(Key) 有7条 // ‘a 为 name a b c d A 也就是A (name a b c d e) 每条里面都是个集合 var selec = alistarr.Select(a => new // a其实是 ‘a 与 A 组合 就是key - arr { a.Key.name, //获取 System.Linq.IGrouping<TKey,TElement> 的键。 Element(元素的意思 可以有多个元素) //所有的Sum 都是要跟在集合后面的 a是 分组后的每条数据 (唯一key value(集合 arr) ) a = a.Sum(p => a.Key.a), // 每一条再求和 p是A (那个集合 arr的每个元素 A) 在这里没有用到 b = a.Sum(p => a.Key.b), // 所以就是 进去 集合 arr的每个元素 A 没用到 返回a.Key.b 就相当于arr中 有多少个元素 就加多少次 a.Key.b c = a.Sum(p => a.Key.c), // 效果就是key的和 (根据key分组 再分组下(key arr) 取得每条 数据的 key的和) arr 中有多少条数据 就把多少个key 加起来 d = a.Sum(p => a.Key.d), e = a.Sum(p => p.e), // a是 key - arr 在arr 中求e 的和 s = a.Sum(p => p.a) // a是 key - arr 在arr 中求a 的和 //每个A里面是有a的 上面是 arr长度个 a.Key.a 的和 这里是 arr 中求a 的和 因为分过组 所以arr 中具有相同a 而又都是arr 一个是arr长度 a.Key.a 之和 一个是arr 中a(和 key.a 相同)的和 所以 a和s 相同 一般不会这么写 逻辑混乱 }).ToList(); var alistarr2 = alist.GroupBy(a => new { a.name }).Select(a => new // 5条 { // key - arr a.Key.name, a = a.Sum(p => p.a), // 根据name分组(5条 也可理解5组) 求每组中a的和 b = a.Sum(p => p.b), c = a.Sum(p => p.c), d = a.Sum(p => p.d), e = a.Sum(p => p.e), });
var alist3 = alist.GroupBy(a => new { a.name, a.a }).Select(a => new
{
a.Key.name,
a = a.Sum(p => p.a),
s = a.Sum(p => a.Key.a)
});
class A
{
public string name { get; set; }
public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
public int d { get; set; }
public int e { get; set; }
}