C#使用控制台应用程序进行LINQ查询练习

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace LINQPriactise
{
    internal class Program
    {
        static List<Person> personList = new List<Person>()
        {
            new Person(){ Id=1,Name="小明",Age=20,Score=100},
            new Person(){ Id=2,Name="小王",Age=40,Score=80},
            new Person(){ Id=3,Name="小刘",Age=60,Score=60},
            new Person(){ Id=3,Name="小刘",Age=60,Score=60},
        };
        static List<Person1> personList1 = new List<Person1>()
        {
            new Person1(){ Id=1,Name="小明",Age=20,Score=100},
            new Person1(){ Id=2,Name="小王",Age=40,Score=80},
            new Person1(){ Id=3,Name="小刘",Age=60,Score=60},
            new Person1(){ Id=3,Name="小刘",Age=60,Score=60},
        };

        static List<object> objList = new List<object>()
        {
            "test1",1,1.34f,"test2",
        };

        static List<Reward> rewardList = new List<Reward>()
        {
            new Reward(){ Id=1,Score=100,RewardName="奖励1"},
            new Reward(){ Id=2,Score=80,RewardName="奖励2"},
            new Reward(){ Id=3,Score=60,RewardName="奖励3"},
        };

        static List<int> numList1 = new List<int>() { 1, 2, 3 };
        static List<int> numList2 = new List<int>() { 4, 5, 6 };
        static List<int> numList = new List<int>() { 1, 2, 3, 1, 2, 3 };


        static void Main(string[] args)
        {
            #region 调用Test类ToString方法的重写

            //TestOverride testOverride = new TestOverride();
            重写方法之前返回
            //Console.WriteLine(testOverride.ToString());

            #endregion

            #region LINQ延迟查询的特性
            //延迟查询是指查询操作并不是在定义的时候执行,而是在遍历集合中的数据时才执行
            //因为作为yield迭代器的主体,只有使用foreach遍历执行到MoveNext时才会真正执行方法

            //var list = personList.Where((p) => p.Age < 30);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            //personList.Add(new Person() { Id = 4, Name = "小赵", Age = 15, Score = 100 });

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region 扩展方法用法
            //Linq有两种写法,查询表达式写法(from.....in.....)和扩展方法写法,两种方法都是相互兼容的,程序编译时会将查询表达式转换为扩展方法,只要实现了IEnumerable的接口就可以使用Linq的扩展方法

            #region SELECT :返回指定类型

            //var list = personList.Select(p => p.Name);
            var list = personList.Select(p => new { id = p.Id, name = p.Name });

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Where:查询特定条件

            //var list = personList.Where((p)=>p.Score > 80  && p.Age < 50);

            //foreach(var person in list)
            //{
            //    Console.WriteLine(person);
            //}

            #endregion

            #region OfType:查询特定数据类型 

            //var list = objList.OfType<string>();

            //foreach(var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Join:将一个集合与另一个集合通过指定键合并,返回合并后的集合

            //var list = personList.Join(rewardList, p => p.Score, r => r.Score, (p, r) => new { pList = p, rList = r });

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region GroupJoin: 将一个集合与另一个集合通过指定键分组

            //var list = personList.GroupJoin(rewardList, p => p.Score, r => r.Score, (p, result) => new { pList = p, count = result.Count() });

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region OrderBy:对集合排序,默认是从小到大排序

            //var list = personList.OrderBy((p) => p.Age).ThenBy((p) => p.Score);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Reverse:反转集合中元素的顺序

            //var list = personList.AsEnumerable().Reverse();

            //foreach(var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region GroupBy:自身分组查询

            //var list = personList.GroupBy((p) => p.Score, (score, p) => new { score = score, count = p.Count() });

            //foreach(var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Any和All:判断集合中是否满足某个/条件

            bool b1 = personList.Any((p) => p.Age < 50);
            bool b2 = personList.All((p) => p.Age < 50);

            Console.WriteLine(b1);
            Console.WriteLine(b2);

            #endregion

            #region Skip:跳过指定个元素查询

            //var list = personList.Skip(1);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Take:只查询指定个元素

            //var list = personList.Take(2);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Sum、Average、Max、Min:计算集合中指定数字类型数据的总和、平均值、最大值、最小值

            //var sum = personList.Sum((p) => p.Age);
            //var avg = personList.Average((p) => p.Age);
            //var max = personList.Max((p) => p.Age);
            //var min = personList.Min((p) => p.Age);

            //Console.WriteLine(sum);
            //Console.WriteLine(avg);
            //Console.WriteLine(max);
            //Console.WriteLine(min);

            #endregion

            #region Concat: 连接两个相同类型集合,合并为一个集合

            //var list = numList1.Concat(numList2);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region Distinct:从集合中去除掉重复的元素

            //var list = numList.Distinct();

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region 使用Distinct去重类中某个字段需要实现IEqualityComparer接口

            //var list = personList1.Distinct(new Person1());

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region ElementAt:得到集合中指定索引的元素,与[]作用相同

            //var value = numList.ElementAt(2);

            //Console.WriteLine(value);

            #endregion

            #region Count:得到集合中满足指定条件的元素个数

            //var count = numList1.Count((n) => n >= 2);

            //Console.WriteLine(count);

            #endregion

            #region First/Single和Last:得到集合中第一个/最后一个元素(如果集合中包含多个元素,使用Single会报错)

            //var value1 = numList1.First((n) => n >= 2);
            //var value2 = numList1.Last((n) => n < 3);

            //Console.WriteLine(value1);
            //Console.WriteLine(value2);

            #endregion

            #region ToDictionary:将集合转换为字典 

            //var list = personList.ToDictionary(p => p.Id);

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region ToList: 将集合转换为list

            //var dict = personList.ToDictionary(p => p.Id);
            //List<Person> list = dict.Values.ToList();

            //foreach (var temp in list)
            //{
            //    Console.WriteLine(temp);
            //}

            #endregion

            #region SequenceEqual:判断两个集合是否相等

            List<int> list1 = new List<int>() { 1, 2, 3 };
            List<int> list2 = new List<int>() { 3, 1, 2 };
            list1 = list1.OrderBy(temp => temp).ToList();
            list2 = list2.OrderBy(temp => temp).ToList();

            Console.WriteLine(list1.SequenceEqual(list2));

            #endregion

            #endregion

            Console.ReadLine();
        }



    }

    class TestOverride
    {
        //重写了ToString方法
        public override string ToString()
        {
            return "重写了ToString方法";
        }
    }

    class Person
    {
        public int Id;
        public string Name;
        public int Age;
        public int Score;

        //重写了ToString方法
        public override string ToString()
        {
            return Id + "," + Name + "," + Age + "," + Score;
        }
    }

    class Reward
    {
        public int Id;
        public int Score;
        public string RewardName;

        //重写了ToString方法
        public override string ToString()
        {
            return Id + "," + Score + "," + RewardName;
        }
    }

    class Person1 : IEqualityComparer<Person1>
    {
        public int Id;
        public string Name;
        public int Age;
        public int Score;

        public new bool Equals(Person1 x, Person1 y)
        {
            if (x == null || y == null)
            {
                return false;
            }
            if (x.Age == y.Age)
            {
                return true;
            }
            return false;
        }

        public int GetHashCode(Person1 obj)
        {
            return obj.Age.GetHashCode();
        }

        public override string ToString()
        {
            return Id + "," + Name + "," + Age + "," + Score;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值