static void Main(string[] args) { #region 匿名类型,匿名类型数组 //匿名类型 var o = new { name = "123", value = "456" }; //匿名类型数组 var ol = new[]{ new {name="123",value="456"}, new {name="123",value="456"}, new {name="123",value="456"}, new {name="123",value="456"}, }; #endregion #region Linq函数 Where ,WhereMany,Join,GroupJoin,OrderBy()和ThenBy() //查询结果过滤 Where函数 List<int> list1 = new List<int>() { 6, 4, 2, 7, 9, 0 }; list1.Where(c => c > 5); //Many,可以理解为cross join List<int> ManyList1 = new List<int>() { 1, 2, 3, 4, 5, 6 }; List<int> ManyList2 = new List<int>() { 6, 4, 2, 7, 9, 0 }; var queryMany = ManyList1.SelectMany(c => ManyList2); foreach (var item in queryMany) Console.WriteLine("{0}", item); var selector1 = from item in ManyList1 from item2 in ManyList2 select new { a = item, b = item2 }; foreach (var q in selector1) Console.WriteLine("{0}", q); var selector2 = list1.SelectMany(x => ManyList2, (a, b) => new { a, b }); //联接数据join和GroupJoin var queryJoin = from item in ManyList1 join item2 in ManyList2 on item equals item2 select item2; //使用 Linq Join var queryJoin1 = ManyList1.Join(ManyList2, item1 => item1, item2 => item2, (item1, item2) => item2); foreach (var qu in queryJoin1) Console.WriteLine("{0}", qu); //GroupbyJoin var queryGroupJoin = ManyList1.GroupJoin(ManyList2, item1 => item1, item2 => item2, (item1, item2) => new { v = item1, c = item2.Count() }); foreach (var GroupJoin in queryGroupJoin) Console.WriteLine("{0}", GroupJoin); //数据排序 OrderBy()和ThenBy() var nameValues = new[] { new {name="Allen",value=65}, new {name="Abbey",value=120}, new {name="Slong",value=330}, new {name="George",value=213}, new {name="Meller",value=329}, new {name="Mary",value=192}, new {name="Sue",value=200}, }; var sortedNames = nameValues.OrderBy(c => c.name); var sortedValues = nameValues.OrderBy(c => c.value); var str = new string('-', 10); Console.WriteLine("---OrderBy()Demo sortedNames"); foreach (var item in sortedNames) Console.WriteLine("name:{0},value:{1}", item.name, item.value); Console.WriteLine("---OrderBy()Demo SortedValues"); foreach (var item in sortedValues) Console.WriteLine("name:{0},value:{1}", item.name, item.value); //多重排序,如果要设置多重排序条件,务必使用OrderBy()加上ThenBy()的组合,若使用 //OrderBy()+OrderBy()会使排序被执行两次,最终的结果会使最后一个orderBy()所产生的结果 var sortedByNameValues = nameValues.OrderBy(x => x.name).ThenBy(x => x.value); var sortedByValueNames = nameValues.OrderBy(x => x.value).ThenBy(x => x.name); Console.WriteLine("---OrderBy()Demo sortedByNameValues"); foreach (var item in sortedByNameValues) Console.WriteLine("name:{0},value:{1}", item.name, item.value); Console.WriteLine("---OrderBy()Demo sortedByValueNames"); foreach (var item in sortedByValueNames) Console.WriteLine("name:{0},value:{1}", item.name, item.value); var sortedOrderByNameValues = nameValues.OrderBy(x => x.name).OrderBy(x => x.value); var sortedOrderByValueNames = nameValues.OrderBy(x => x.value).OrderBy(x => x.name); Console.WriteLine("---OrderBy()Demo sortedOrderByNameValues"); foreach (var item in sortedOrderByNameValues) Console.WriteLine("name:{0},value:{1}", item.name, item.value); Console.WriteLine("---OrderBy()Demo sortedOrderByValueNames"); foreach (var item in sortedOrderByValueNames) Console.WriteLine("name:{0},value:{1}", item.name, item.value); #endregion #region 获取集合 ToArray,ToList Skip,SkipWhile,Take,TakeWhile var arrayOutput = nameValues.ToArray(); var ListOutput = nameValues.ToList(); var dictOutput1 = nameValues.ToDictionary(x => x.name); var dictOutput2 = nameValues.ToDictionary(x => x.name, x => x.value); int[] arrSkip = { -35, 53, 5, -34, 56, 45, 34, 5, -34, 45, 2, 3, 6 }; var querySkip = arrSkip.Skip(5); Console.WriteLine("去除前面5个"); foreach (var item in querySkip) //结果为: 45, 34, 5, -34, 45, 2, 3, 6 Console.WriteLine(item); int[] number = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 12, 0 }; var allButFirst3Numbers = number.SkipWhile(n => n % 3 != 0); foreach (var skipItem in allButFirst3Numbers) Console.WriteLine(skipItem); //take int[] numbersTake = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var first3 = numbersTake.Take(3); //从第一个元素开始,只获取前面三个 Console.WriteLine("First 3 numbers:"); foreach (var n in first3) { Console.WriteLine(n);//结果 5 4 1 } //TakeWhile 从第一个元素开始,一直比较,直到比较到条件结束为止,false就停止继续比较了 var firstNumbers6 = numbersTake.TakeWhile(n => n < 6); foreach (var n in firstNumbers6) { Console.WriteLine(n);//结果为 5 4 1 3 } #endregion #region 集合的运算 合集Union,并集 intersect,补集except,唯一 distinct int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; int[] numbersB = { 1, 3, 5, 7, 8 }; int[] numberSeries = { 2, 2, 3, 5, 5 }; //Union 合集 当2个数据源相同时,则保留一个 var unionResult = numbersA.Union(numbersB); //Intersect 交集 将A的值和B对比,将A B相同的A值则保留 var intersectResult = numbersA.Intersect(numbersB); //Intersect 补集 将A的值和B对比,将A B不相同的A值则保留 var distinctValues = numberSeries.Distinct(); var exceptResult = numbersA.Except(numbersB); Console.WriteLine("unionResult"); foreach (var q in unionResult) { Console.WriteLine(q); } Console.WriteLine("intersect"); foreach (var q in intersectResult) { Console.WriteLine(q); } Console.WriteLine("except"); foreach (var q in exceptResult) { Console.WriteLine(q); } Console.WriteLine("distinct"); foreach (var q in distinctValues) { Console.WriteLine(q); } #endregion #region 访问元素 IEnumberale<T>本身就是集合对象,所以针对集合对象所需要的元素访问 var firstLastItems = new[] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; string firstContains = firstLastItems.First(s => s.Contains('o')); string lastContains = firstLastItems.Last(s => s.Contains('o')); Console.WriteLine("First:{0}", firstContains); Console.WriteLine("Last:{0}", lastContains); string itemAtThree = firstLastItems.ElementAt(3); string indexAtSix = firstLastItems.ElementAt(5); Console.WriteLine("itemAtThree:{0}", itemAtThree); Console.WriteLine("indexAtSix:{0}", indexAtSix); #endregion #region 聚合与汇总 Max, Min, Sum, Average,Aggregate double myBalance = 100.0; int[] withdrawItem = { 20, 10, 40, 50, 10, 70, 30 }; double balance = withdrawItem.Aggregate(myBalance, (originbalance, nextWithdrawal) => { Console.WriteLine("originbalance:{0},nextWithdrawal:{1}", originbalance, nextWithdrawal); Console.WriteLine("withdrawItem status:{0}", (nextWithdrawal <= originbalance) ? "OK" : "FALLED"); return ((nextWithdrawal <= originbalance) ? (originbalance - nextWithdrawal) : originbalance); }); Console.WriteLine("Ending balance:{0}", balance); #endregion Console.ReadLine(); }