最近在网上找到一个关于LINQ学习的例子,它将不同的操作分不同的项目来讲,今天先来看一下group....by...
先看一下这里的数据构造是怎么做的。
DataSet ds = new DataSet(); //先实例化一个DataSet ds.Tables.Add(CreateNumbersTable()); private static DataTable CreateNumbersTable() //添加Table到ds { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; DataTable table = new DataTable("Numbers"); //实例化一个名为Numbers的Table table.Columns.Add("number", typeof(int)); //添加一列名为number,类型为int foreach (int n in numbers) { table.Rows.Add(new object[] { n }); //将数据添加到table } return table; //返回table }
GroupingOperators
1>按数字分组,这里的例子是按数字除以5以后的余数来分组的。
//从Numbers表获取数据 var numbers = ds.Tables["Numbers"].AsEnumerable(); //将数据按除以5后的余数 分组 var numberGroups = from n in numbers group n by n.Field<int>("number") % 5 into g select new { Remainder = g.Key, Numbers = g }; //将分组后的 数输出 foreach (var m in numberGroups) { Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", m.Remainder); foreach (var x in m.Numbers) { Console.WriteLine(x.Field<int>("number")); } }
AsEnumerable:这里是延迟加载的意思。
Field<列的类型>("列的名称")
group n by n.Field<int>("number") % 5 into g:将n按n的number列的数据除以5的余数(n.Field<int>("number") % 5)分组放入g中
select new {Remainder=g.Key,Number=g}:key=Remainder=g.Key,value=Number=g
2>按字符串首字母分组
group w by w.Field<string>("word")[0] into g select new { FirstLetter = g.Key, Words = g };
Field<string>("word")[0]:word列值得首字母
3>按某一字段分类(将商品按Category分类)
group p by p.Field<string>("Category") into g select new { Category = g.Key, Products = g };
4>GroupBy-Comparer
数据:string[] anagrams = { "from ", " salt", " earn ", " last ", " near ", " form " };
var orderGroups = anagrams.GroupBy( w => w.Field<string>("anagram").Trim(), new AnagramEqualityComparer());
var orderGroups = anagrams.GroupBy( w => w.Field<string>("anagram").Trim());
5>GroupBy-Comaparer,Mapped
var orderGroups = anagrams.GroupBy( w => w.Field<string>("anagram").Trim(), a => a.Field<string>("anagram").ToUpper(), new AnagramEqualityComparer() );