Linq常用积累


1.如何确定一个集合对象里面是否有重复的项

list.GroupBy(p => p.PropertyName).Where(i => i.Count() > 1).Count() > 0

2.找集合中符合条件的某个元素 这里我建议用FindIndex

class Program
    {
        static void Main(string[] args)
        {
            List<Test> testList=new List<Test>();
            for (int i = 0; i < 100; i++)
            {
                Test test = new Test();
                test.Id = i + 1;
                test.Name = $"A{i}";
                testList.Add(test);
            }
            //如果找到元素返回该正确的索引,找不到返回-1 【该方法推荐日常生产使用】
            int index = testList.FindIndex(t => t.Id == 1000);

            //缺点:如果找不到元素就会报错
            var test1 = testList.First(t => t.Id == 1000);

            //如果找到元素返回对应元素,如果找不到 引用类型返回null 值类型返回该值得默认值 比如说int就会返回0
            var test2 = testList.FirstOrDefault(t => t.Id == 1000);
            //缺点 如果我要去找值为0的元素 他返回了一个0,你无法判断是找到的还是没找到而返回的默认值
            var test3 = testList.Select(t=>t.Id).FirstOrDefault(t => t == 0);

            Console.ReadKey();
        }


        class Test
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    }
View Code

 3.生产有序的数组

List<int> numList2 = Enumerable.Range(0, 1000).ToList();

4.数组乱序

List<int> numList3 = numList2.OrderBy(n =>Guid.NewGuid()).ToList(); 

 5.求 差集Except  交集Intersect  并集Union  这三个方法有个共同的特点,就是所有的求出的值都会去重

List<int> list1 = new List<int>() { 1, 2, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10 };
            List<int> list2 = new List<int>() { 1, 1, 1, 2, 3, 4, 5, 11, 12 };

            var list3 = list1.Except(list2);
            //求差集
            //意思就是第一个集合会去除与第二个集合相同的元素,第一个集合中重复的元素都会被去重
            //结果:6 7 8 9 10

            var list4 = list1.Intersect(list2);
            //求交集
            //意思就是第一个集合中与第二个集合中相同的元素组成一个不重复的新的集合
            //结果:1 2 3 4 5

            var list5 = list1.Union(list2);
            //求并集
            //意思就是第一个集合与第二个集合中所有的元素合并,并去掉重复的元素
            //结果:1 2 3 4 5 6 7 8 9 10 11 12
View Code

 6.集合切片操作 Take  Skip

           List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

            var list2 = list1.Skip(3);
            //跳过指定的数量的序列中的元素,然后返回剩余元素 结果不包含指定的元素
            //结果:4 5 6 7 8 9 10

            var list3 = list1.Take(3);
            //从序列的开头返回指定的数量的连续元素 结果包含指定的元素
            //结果:1 2 3
View Code

 

7.使用DistinctBy去重对象集合

List<MyClass> myClassList = new List<MyClass>();
myClassList.Add(new MyClass() { Id = 1, Name = "张三1" });
myClassList.Add(new MyClass() { Id = 2, Name = "张三1" });
myClassList.Add(new MyClass() { Id = 1, Name = "张三3" });
myClassList.Add(new MyClass() { Id = 4, Name = "张三4" });
myClassList.Add(new MyClass() { Id = 5, Name = "张三5" });
myClassList.Add(new MyClass() { Id = 6, Name = "张三6" });
var distinctById = myClassList.DistinctBy(m => m.Id);
var distinctByName = myClassList.DistinctBy(m => m.Name);

按指定的属性进行去重,去重结果是保存属性条件的第一条,后面的舍去掉,目前只有.net6支持

 

posted @ 2021-08-25 10:24  晨晞gg  阅读(33)  评论(0编辑  收藏  举报