zoukankan      html  css  js  c++  java
  • Linq学习总结(5)——标准查询运算符

    筛选信息

    在Linq中可以通过两种方法筛选信息,where和OfType。Where子句大家应该都很熟,OfType是用于筛选能够转换为特定类型的值。

    static void Main(string[] args)
       {
        Object[] objects = new Object[] { 123, "hello", 67.5f, 7M, "six", 89, true };
        var intArray = objects.OfType<int>();
    
        foreach (var item in intArray)
        {
            Console.WriteLine(item);
        }
        /*Output
         * 123
         * 89
         */
        }
     

    限定符


    限定符All、Any、Contains都是扩展方法,他们返回一个布尔值,指示集合中的部分或者全部元素是否满足限定符的参数条件。All判断是否每个成员都满足条件。Any返回一个布尔值,指示是否有满足条件的成员。Contains用于查询符合条件的单个元素。

    class Program
    {
        static void Main(string[] args)
        {
           
            var persons = new List<Person>{new Person{Name="Jack",Gender="Male",Age="32"}
                ,new Person{Name="Chris",Gender="Male",Age="27"}
                ,new Person{Name="Paul",Gender="Male",Age="25"}
            };
    
            bool anyJack = persons.Any(m => m.Name == "Jack");
            Console.WriteLine("是否有人叫Jack:{0}",anyJack);
            bool allMale = persons.All(m => m.Gender == "Male");
            Console.WriteLine("是否都是男性:{0}",allMale);
           /*Output
            * 是否有人叫Jack:true
            * 是否都是男性:true
            */
    
        }
    }
    
    class Person
    {
        public String Name { get; set; }
        public String Gender { get; set; }
        public String Age { get; set; }
    
        public override string ToString()
        {
            return string.Format("Name={0},Gender={1},Age={2}", Name, Gender, Age);
        }
    }
     

    分区操作

    Skip、skipWhile、Take和TakeWhile用于将集合拆分成两个部分并返回其中的一个。Skip会根据你输入的整数参数跳到相应的位置,并返回之后的所有元素;SkipWhile会根据你输入的条件,跳到直到你第一个输入条件为假的元素位置,并返回之后的所有元素;Take会返回你指定位置之前的 所有元素;TakeWhile会跳到直到你第一个输入条件为假的元素位置,并返回之前的所有元素。

    static void Main(string[] args)
    {
          int[] ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
         var result1 = ints.Take(5);
         Array.ForEach(result1.ToArray(), n => Console.Write(string.Format("{0} ", n)));
           Console.WriteLine();
    
           var result2 = ints.Skip(5);
          Array.ForEach(result2.ToArray(), n => Console.Write(string.Format("{0} ", n)));
         Console.WriteLine();
    
         var result3 = ints.TakeWhile(n => n < 5);
         Array.ForEach(result3.ToArray(), n => Console.Write(string.Format("{0} ", n)));
         Console.WriteLine();
    
         var result4 = ints.SkipWhile(n => n < 5);
         Array.ForEach(result4.ToArray(), n => Console.Write(string.Format("{0} ", n)));
         Console.WriteLine();
    
        /*Output
         * 1 2 3 4 5
         * 6 7 8 9 10
         * 1 2 3 4
         * 5 6 7 8 9 10
         */
    }
     

    生成运算


    生成运算有DefaultIfEmpty、Empty、Range以及Repeat。

    DefaultIfEmpty在一个序列为空时,生成单一序列的默认值;如果序列不为空,则直接返回序列。这个方法在联接查询中很有用。

    static void Main(string[] args)
    {
        List<int> numbers = new List<int>();
        Console.WriteLine(numbers.Count);
        var defalutNumbers = numbers.DefaultIfEmpty();
        Console.WriteLine(defalutNumbers.Count());
        /*Output
         * 0
         * 1
         */ 
    }

    Empty会根据传入的参数生成一个空的序列。

    static void Main(string[] args)
    {
        var empties = Enumerable.Empty<int>();
    
        Console.WriteLine(empties.Count());
        /*Output
         * 0
         */
    }

    Range会生成指定范围的数列,它有两个参数,第一个参数为序列中第一个数的值,第二个参数为生成数列的个数。

    static void Main(string[] args)
    {
       var numbers = Enumerable.Range(0, 10);
       foreach (var item in numbers)
       {
           Console.WriteLine(item);
       }
       /*Output
        * 0
        * 1
        * 2
        * 3
        * 4
        * 5
        * 6
        * 7
        * 8
        * 9
        */
    }

    Repeat用来生成一个重复的数列。

    static void Main(string[] args)
    {
        var repeatStr = Enumerable.Repeat<String>("Jim", 10);
        foreach (var item in repeatStr)
        {
            Console.WriteLine(item);
        }
        //输出十行Jim
    }
     

    相等性操作

    SequenceEqual和Except可以用来比较数列的相等性和计算差集。

    static void Main(string[] args)
    {
        int[] nums1 = { 1, 2, 3 };
        int[] nums2 = { 1, 2, 3 };
        int[] nums3 = { 1, 2, 3, 4, 5 };
    
        Console.WriteLine(nums1.SequenceEqual(nums2));
        Console.WriteLine(nums1.SequenceEqual(nums3));
    
        var exceptNums = nums3.Except(nums1);
        foreach (var item in exceptNums)
        {
            Console.WriteLine(item);
        }
        /*Output
         * Ture
         * False
         * 4
         * 5
         */ 
    }

    获取指定元素操作

    获取指定元素操作方法有:ElementAt、ElementAtOrDefault、Frist、FristOfDefault、Last、LastOrDefault、Single以及SingleOrDefault。

    ElementAt返回序列中的指定的元素。ElementAtOrDefault返回序列中指定元素,如果超出序列范围,则返回该类型的默认值。Frist返回序列中的第一个元素。FristOfDefault返回序列中满足条件的第一个元素,没有则返回一个默认值。Last和LastOfDefault方法与Frist和FirstOfDefault一样,不过是返回最后一个。Single是返回集合中的唯一条件。SingleOrDefault则返回序列中满足条件的唯一值,如果没有则返回默认值。

    static void Main(string[] args)
    {
        var numbers = Enumerable.Range(0, 9);
    
        //elementAt
        var elemnt = numbers.ElementAt(5);
        Console.WriteLine("Element at 5 is {0}",elemnt);
    
        //elementOrDefault
        var elemntOrDefault = numbers.ElementAtOrDefault(11);
        Console.WriteLine("Element at 11 or default is {0}",elemntOrDefault);
    
        //frist
        var fristNumber = numbers.First();
        Console.WriteLine("Frist:{0}",fristNumber);
    
        //fristOrDefault
        var fristOrDefault = numbers.FirstOrDefault(n => n > 10);
        Console.WriteLine("Frist Or Default",fristOrDefault);
    
        //single
        var single = numbers.Single(n => n == 5);
        Console.WriteLine("Single:{0}",single);
    
        //singleOrDefault
        var singleOrDefault = numbers.SingleOrDefault(n => n == 11);
        Console.WriteLine("Single or default:{0}",singleOrDefault);
    
    }
    
    

    串联序列

    Conect将一个序列附加到另一个序列上。

    static void Main(string[] args)
    {
          var fristNumbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        var secondNumbers = new int[] { 10,11,12,13,14,15,16,17,18,19};
    
        var conectNumbers = fristNumbers.Concat(secondNumbers);
    
        foreach (var item in conectNumbers)
        {
            Console.WriteLine(item);
        }
    
    }
    
  • 相关阅读:
    CIFAR10-网络训练技术
    论文-Deep Residual Learning for Image Recognition
    Origin-作图相关
    OnCtlColor
    查看电脑MAC地址
    改变静态文本框和PictureControl的背景颜色
    MFC在对话框中的Picture contrl控件中添加icon图标,并改变icon图标的背景色与对话框背景色一致
    char型数组学习
    条件编译
    ASCII码
  • 原文地址:https://www.cnblogs.com/heqichang/p/2108002.html
Copyright © 2011-2022 走看看