先看最简单的例子:
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后所接的元素