高效的Linq

语言集成查询
常见用途:.NET原生集合(List,Array,Dictionary等等)
SQL数据库
XML文档
JSON文档

常见功能:
排序、筛选、选择、分组、聚合、合并、最大值、最小值、求和、求平均、求数量等等;

两种形式:
查询表达式 query expression
链式表达式 chained expression


延迟执行
消耗:foreach、tolist(),toarray,todictionary,count(),min(),max(),sum(),take(),first(),last()

IEnumerable
IOrderedEnumerable
IQueryable(包含语法树)
ParallelQuery

 

/// <summary>
/// linq的两种写法:查询表达式 query expression和链式表达式 chained expression 
/// 1.Max()和MaxBy()的区别
/// 2.不要滥用ToList,Count,OrderBy
/// 3.first和single的区别
/// </summary>
internal class LinqDemoCls
{
    public static void Method()
    {
        var arr = Enumerable.Range(1, 10).ToArray()
            .AsParallel()
            .AsOrdered()//多线程下还要保证排序
            .Select(x =>
        {
            Thread.Sleep(500);
            return x * x;
        })
            .AsSequential();//AsSequential 将多线程的又转为IEnumerable

        foreach (var x in arr)
        {
            Console.WriteLine(x);
        }
    }


    /// <summary>
    /// 展平,二维数组变一维数组
    /// </summary>
    public static void Method2()
    {
        var mat = new int[][] {
        new[] { 1,2,3,4},
        new []{5,6,7,8 },
        new []{9,10,11,12 }
        };

        var res = from row in mat
                  from n in row
                  select n;

        var res2 = mat.SelectMany(x => x);

        res2.ToArray();
    }

    /// <summary>
    /// 笛卡尔积
    /// </summary>
    public static void Method3()
    {
        for(int i = 0; i < 5; i++)
        {
            for(int j = 0; j < 4; j++)
            {
                for(int k=0;k<3;k++)
                {
                    Console.WriteLine($"{i}{j}{k}");
                }
            }
        }

        var res = from i in Enumerable.Range(0, 5)
                  from j in Enumerable.Range(0, 4)
                  from k in Enumerable.Range(0, 3)
                  select $"{i}{j}{k}";

        res.ToList();

        var res2 = Enumerable.Range(0, 5)
            .SelectMany(r => Enumerable.Range(0, 4), (l, r) => (l, r))
            .SelectMany(r => Enumerable.Range(0, 3), (l, r) => (l.l, l.r, r))
            .Select(x => x.ToString());

        res2.ToList();
    }

    /// <summary>
    /// 字母出现次数,频率
    /// </summary>
    public static void Method4()
    {
        var words = new string[] { "tom", "jerry", "spike", "tyke", "butch", "quacker" };

        var query = from w in words
                    from c in w
                    group c by c into g
                    select new { g.Key, Count = g.Count() } into a
                    orderby a.Count descending
                    select a;
        query.ToList();

        var query2 = words.SelectMany(c => c)
            .GroupBy(c => c)
            .Select(g => new { g.Key, Count = g.Count() })
            .OrderBy(g => g.Count);

        query2.ToList();
    }

    /// <summary>
    /// 批量下载文件
    /// </summary>
    public  async void Method5()
    {
        var urls = new string[]
        {
            "http://www.example.com/pic1.jpg",
            "http://www.example.com/pic2.jpg",
            "http://www.example.com/pic3.jpg",
        };

        //var tasks = new List<Task>();
        //foreach(var url in urls)
        //{
        //    tasks.Add(DownloadAsync(url, url.Split('/').Last()));
        //}

       // var tasks = urls.Select(url => DownloadAsync(url, url.Split('/').Last()));

        var tasks = from url in urls
                     let filename = url.Split("/").Last()
                     select DownloadAsync(url, filename);


        await Task.WhenAll(tasks);
    }

    async Task DownloadAsync(string url,string fileName)
    {
        await Task.Delay(1000);
        Console.WriteLine($"{fileName} download.");
    }


    /// <summary>
    /// 寻找派生类
    /// Humanize 类库,操作字符串
    /// </summary>
    public static void Method6()
    {
        var types = Assembly.GetAssembly(typeof(Exception))
            .GetTypes();

        types.Where(t => t.IsAssignableTo(typeof(Exception)))
            .Select(t => t.Name.Humanize(LetterCasing.Title))
            .OrderBy(t => t.Split().Length).ToList();

        var res = from type in types
                  where type.IsAssignableTo(typeof(Exception))
                  select type.Name.Humanize(LetterCasing.Title) into name
                  let wc = name.Split().Length
                  group name by wc into g
                  orderby g.Key
                  select new { Count = g.Count(), Items = g.ToList() };
      
    }

    /// <summary>
    /// 使用sort代替orderBy
    /// </summary>
    public static void Method7()
    {
        var arr = new List<int> { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
       var a= arr.OrderBy(x => x); //orderBy是开辟了一个新地址内存空间,比较浪费性能

        arr.Sort();// 利用数组的排序方法,在对象本身上操作

        arr.Reverse();//desc的实现
        arr.Order();  //新语法
    }
}

 

posted @ 2024-05-23 16:53  闲云野鹤古刹  阅读(2)  评论(0编辑  收藏  举报