语言集成查询
常见用途:.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(); //新语法 } }
标签:Count,高效,url,void,arr,Linq,var,new From: https://www.cnblogs.com/hcy-zyy/p/18175982