C# LINQ into group by

先看最简单的例子:

string[] words = { "apples", "blueberries", "oranges", "bananas", "apricots" };

            var wordGroups1 =
                from w in words
                group w by w[0] into fruitGroup
                select fruitGroup;

            foreach (var item in wordGroups1)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);     
                }
                Console.WriteLine();
            }
            Console.Read();

输出:

 a has 2 elements.
apples
apricots

 b has 2 elements.
blueberries
bananas

 o has 1 elements.
oranges

下一个例子:

var list = new List<(string FirstName, string LastName)>()
            {
                ("11","1"),
                ("12","2"),
                ("13","3"),
                ("21","1"),
                ("22","2"),
                ("23","3"),
                ("31","1"),
                ("32","2"),
                ("33","3"),

            };

            var q1 = from w in list
                     group w by w.LastName into g1
                     select g1;

            var q2 = from w in list
                     group w by w.FirstName[0] into g1
                     select g1;

            var q3 = from w in list
                     group w by w.FirstName into g1
                     select g1;

            Console.WriteLine("q1的输出:");
            foreach (var item in q1)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                Console.WriteLine();
            }
            Console.WriteLine("q2的输出:");
            foreach (var item in q2)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                Console.WriteLine();
            }
            Console.WriteLine("q3的输出:");
            foreach (var item in q3)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                Console.WriteLine();
            }

输出:

q1的输出:
 1 has 3 elements.
(11, 1)
(21, 1)
(31, 1)

 2 has 3 elements.
(12, 2)
(22, 2)
(32, 2)

 3 has 3 elements.
(13, 3)
(23, 3)
(33, 3)

q2的输出:
 1 has 3 elements.
(11, 1)
(12, 2)
(13, 3)

 2 has 3 elements.
(21, 1)
(22, 2)
(23, 3)

 3 has 3 elements.
(31, 1)
(32, 2)
(33, 3)

q3的输出:
 11 has 1 elements.
(11, 1)

 12 has 1 elements.
(12, 2)

 13 has 1 elements.
(13, 3)

 21 has 1 elements.
(21, 1)

 22 has 1 elements.
(22, 2)

 23 has 1 elements.
(23, 3)

 31 has 1 elements.
(31, 1)

 32 has 1 elements.
(32, 2)

 33 has 1 elements.
(33, 3)

由上面的的例子可以得出group by 的属性就是into对象的key值,用vs打断点更能清楚into对象的属性和值。into的对象包含一个elements数组包含了这个组的所有元素。

再来看如下多重分组例子

var list = new List<(string s1, string s2, string s3)>()
            {
                ("a","1","1"),
                ("b","2","2"),
                ("c","3","3"),
                ("d","1","1"),
                ("e","2","2"),
                ("f","3","3"),
                ("a","3","1")
            };

            var q = from r in list
                    group r  by (r.s2, r.s3) into result
                    select result;

            foreach(var item in q)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                Console.WriteLine();
            }

输出:

 (1, 1) has 2 elements.
(a, 1, 1)
(d, 1, 1)

 (2, 2) has 2 elements.
(b, 2, 2)
(e, 2, 2)

 (3, 3) has 2 elements.
(c, 3, 3)
(f, 3, 3)

 (3, 1) has 1 elements.
(a, 3, 1)

由上例子可看出只有2个属性都相等时才分到同一组

再看个例子

            var list = new List<(string s1, string s2, string s3)>()
            {
                ("a","1","1"),
                ("b","2","2"),
                ("c","3","3"),
                ("d","1","1"),
                ("e","2","2"),
                ("f","3","3"),
                ("a","3","1")
            };

            var q = from r in list
                    group r.s1  by (r.s2, r.s3) into result
                    select result;

            foreach(var item in q)
            {
                Console.WriteLine($" {item.Key} has {item.Count()} elements.");
                foreach (var item1 in item)
                {
                    Console.WriteLine(item1);
                }
                Console.WriteLine();
            }

输出:

 (1, 1) has 2 elements.
a
d

 (2, 2) has 2 elements.
b
e

 (3, 3) has 2 elements.
c
f

 (3, 1) has 1 elements.
a

由这个例子可看出每个分组的element就是group后所接的元素

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值