LINQ:数据查询

  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();
        }

猜你喜欢

转载自www.cnblogs.com/chaonuanxi/p/12656065.html