第5章 LINQ

5.4 LINQ查询运算符

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            
            List<Person> list = new List<Person>();
            list.Add(new Person() { Name = "Tim Duncan", Age = 40 ,Bir=DateTime.Parse("1976-01-01 10:10:10")});
            list.Add(new Person() { Name = "Tracy McGrady", Age = 37, Bir = DateTime.Parse("1980-01-01 10:10:10") });
            list.Add(new Person() { Name = "LeBron James", Age = 31, Bir = DateTime.Parse("1984-01-01 10:10:10") });
            list.Add(new Person() { Name = "Kobe Bryant", Age = 37, Bir = DateTime.Parse("1979-01-01 10:10:10") });

            ArrayList arrayList = new ArrayList();
            arrayList.Add(100);
            arrayList.Add(DateTime.Now);
            arrayList.Add("Have fun");
            arrayList.Add("Interesting");

            //1.Where() 基于顺序号index筛选
            List<Person> query1 = list.Where((x, index) => index >= 0 && index <= 2).ToList();

            //2.OfType() 定义在非泛型IEnumerable上,它的作用是从非泛型集合中筛选出某一类型的成员并返回IEnumerable<T>。
            List<string> query2 = arrayList.OfType<string>().Where(_ => _.StartsWith("Have")).ToList();

            //3.Cast() 与OfType()类似,Cast()也定义在IEnumerable上,它用于将非泛型的序列转换为泛型序列IEnumerable<T>。当某一序列项无法成功转换时,则会抛出异常:
            //List<string> query3 = arrayList.Cast<string>().ToList();//异常,指定的转换无效

            //4.OrderBy()、ThenBy()、OrderByDescending()和ThenByDescending()
            List<Person> query4 = list.OrderBy(_ => _.Name).ToList();
            List<Person> query5 = list.OrderBy(_ => _.Bir.DayOfWeek).ToList();
            List<Person> query6 = list.OrderBy(_ => _.Name).ThenByDescending(_ => _.Age).ToList();

            //5.Select()
            List<SelectedItem> query7 = list.Select(_ => new SelectedItem() { Name = _.Name }).ToList();

            //6.Take()和Skip()
            List<Person> query8 = list.Take(2).ToList();
            List<Person> query9 = list.Skip(2).ToList();

            //7.TakeWhile()和SkipWhile()
            int[] array = { 1, 2, 10, 5, 7 };
            //array = array.TakeWhile(_ => _ <= 5).ToArray();
            //array = array.SkipWhile(_ => _ <= 5).ToArray();

            //8.Reverse()
            array = array.Reverse().ToArray();

            //9.DefaultIfEmpty()
            int[] array1 = { };
            //array1 = array1.DefaultIfEmpty(0).ToArray();
            array1 = array1.DefaultIfEmpty(100).ToArray();
            //注意到int是结构类型(值类型),它的默认值为0。当为类类型时,默认值为null,此时如果不指定默认值则会抛出异常:未将对象引用设置到对象的实例。
            List<Person> list1 = new List<Person>();
            List<Person> list2 = list1.DefaultIfEmpty().ToList();
            //list2.ToArray()[0].ToString();//异常

            //10.Distinct() 传递一个IEqualityComparer<T>类型,它包含了对象比较的算法
            List<Person> query10 = list.Distinct(new PointComparer()).ToList();

            //11.GroupBy()
            List<IGrouping<int, Person>> query11 = list.GroupBy(_ => _.Age).ToList();
            foreach (var item in query11)
            {
                foreach (var person in item)
                {
                    Console.WriteLine(person.Name);
                }
            }

            //12.Intersect()和Except()
            int[] array2 = { 0, 1, 2 };
            int[] array3 = { 2, 3, 4 };
            int[] query12 = array2.Intersect(array3).ToArray(); // 得到 2

            Person[] array4 = { new Person() { Name = "Tracy McGrady", Age = 37 } };
            Person[] array5 = { new Person() { Name = "Kobe Bryant", Age = 37 } };
            List<Person> query13 = array4.Intersect(array5, new PointComparer()).ToList();

            query12 = array2.Except(array3).ToArray(); // 得到 2

            //13.Concat()和Union()
            //query12 = array2.Concat(array3).ToArray();
            query12 = array2.Union(array3).ToArray();

            //14.Zip()
            int[] array6 = { 1, 2, 3, 4, 5 };
            string[] array7 = { "星期一", "星期二", "星期三" };
            string[] array8 = array6.Zip(array7, (x, y) => string.Format("{0},{1}", x, y)).ToArray();

            //15.ElementAt()和ElementAtOrDefault()
            //16.First()和FirstOrDefault()
            //17.Last()和LastOrDefault()
            //18.Single()和SingleOrDefault()
            //19.Count()和LongCount()
            //20.Max()、Min()、Average()和Sum()
            //21.Aggregate()
            int[] array9 = { 1, 2, 3 };
            int sum = array9.Aggregate(0, (total, x) => total + (x * 2));
            Console.WriteLine(sum);

            //22.Contains()、Any()、All()和SequenceEqual()
            Console.Read();
        }
    }

    public class PointComparer : IEqualityComparer<Person>
    {

        public bool Equals(Person x, Person y)
        {
            return x.Age == y.Age;
        }

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

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime Bir { get; set; }
    }

    public class SelectedItem
    {
        public string Name { get; set; }
    }
}
原文地址:https://www.cnblogs.com/liuslayer/p/5455565.html