C#學習相關系列之Linq用法---group和join相關用法(三)

一、Group用法

?????????在C#的LINQ中,Grou將集合中的元素按照指定的鍵進行分組。Group方法返回一個IEnumerable<IGrouping<TKey, TElement>>類型的集合,其中TKey表示分組的鍵類型,TElement表示集合中元素的類型。每個IGrouping<TKey, TElement>對象表示一個分組,其中Key屬性表示分組的鍵,而IEnumerable<TElement>表示分組中的元素集合。

1、groupby的定義:

//Linq語句
var tt = from e in stuList group e by e.Math;
//lambda 表達式
var tt = stuList.GroupBy(p=>p.Math);

示例代碼:

List<Student_1> stuList = new List<Student_1>()
{new Student_1(){ID=1,Name="John",Chinese=92,Math=88,English=92},new Student_1(){ID=2,Name="Mary",Chinese=87,Math=94,English=82},new Student_1(){ID=3,Name="KangKang",Chinese=89,Math=91,English=96},new Student_1(){ID=4,Name="Maria",Chinese=88,Math=65,English=94},new Student_1(){ID=5,Name="Ben",Chinese=70,Math=91,English=82},
};
//var tt = from e in stuList group e by e.Math;//linq語句var tt = stuList.GroupBy(p=>p.Math);//lambda表達式
foreach (var item in tt)
{Console.WriteLine(item.Key);foreach (var e in item){Console.WriteLine("    "+e.Name);}
}

運行結果為:

2、group...into...用法可以生成一個temp組

var tt = from e in stuListgroup new { e.Math, e.ID, e.Name } by e.Math  into temp select new { temp.Key, value1 = temp.Select(p => new { p.ID, p.Name }), value2 = temp.Select(p => p.Name) };
//  var tt = stuList.GroupBy(p => p.Math, e => new { e.Math, e.ID, e.Name }).Select(temp => new { temp.Key, value1 = temp.Select(p => new { p.ID, p.Name }), value2 = temp.Select(p => p.Name) });
foreach (var item in tt)
{Console.WriteLine(item.Key);foreach (var e in item.value1){Console.WriteLine(e.Name);}
}

運行結果為:

二、Join用法

Linq中的join用于將兩個集合中的元素進行匹配,返回一個新的集合。

1、內部鏈接 Join? (join… in… on …equals…)

定義:

//使用查詢語句 Linq
var list = from T1 in dataSource1join T2 in dataSource2 on T1.ID equals T2.IDselect new {Name = T1.Name,ID=T1.ID,NickName = T2.NickName};//使用查詢方法 lambda 表達式
var list = dataSource1.Join(dataSource2,T1 => T1.ID,T2 => T2.ID, (T1,T2) => new {Name = T1.Name,ID=T1.ID,NickName = T2.NickName
});

代碼示例:

List<Student> students = new List<Student>()
{new Student() { Id = 1, Name = "Tom" },new Student() { Id = 2, Name = "Jerry" },new Student() { Id = 3, Name = "Mike" }
};List<Course> courses = new List<Course>()
{new Course() { Id = 1, Name = "Math", StudentId = 1 },new Course() { Id = 2, Name = "English", StudentId = 1 },new Course() { Id = 3, Name = "Math", StudentId = 2 },new Course() { Id = 4, Name = "Science", StudentId = 3 }
};// 使用join將學生和課程進行匹配
var result = from s in studentsjoin c in courses on s.Id equals c.StudentIdselect new { StudentName = s.Name, CourseName = c.Name };
// 輸出結果
foreach (var item in result)
{Console.WriteLine("{0}選了{1}課程", item.StudentName, item.CourseName);
}

運行結果為:

2、分組鏈接Groupjoin (join…in…on…equals…into…)

定義:

//lambda 表達式
var result = students.GroupJoin(courses, p => p.Id,s => s.StudentId,(p, e) => new { StudentName = p.Name, CourseName =e.Select(m=>m.Name)});//linq 語句
var result = from left in students join right in courses on left.Id equals right.StudentId into temp select new { StudentName = left.Name, CourseName = temp.Select(m => m.Name) };
// temp 其實為course的分組

代碼示例:

// 創建學生和課程集合
List<Student> students = new List<Student>()
{new Student() { Id = 1, Name = "Tom" },new Student() { Id = 2, Name = "Jerry" },new Student() { Id = 3, Name = "Mike" }
};List<Course> courses = new List<Course>()
{new Course() { Id = 1, Name = "Math", StudentId = 1 },new Course() { Id = 2, Name = "English", StudentId = 1 },new Course() { Id = 3, Name = "Math", StudentId = 2 },new Course() { Id = 4, Name = "Science", StudentId = 3 }
};
// var result = students.GroupJoin(courses, p => p.Id,s => s.StudentId,(p, e) => new { StudentName = p.Name, CourseName =e.Select(m=>m.Name)});
var result = from left in students join right in courses on left.Id equals right.StudentId into temp select new { StudentName = left.Name, CourseName = temp.Select(m => m.Name) };
// temp 其實為course的分組
// 使用join將學生和課程進行匹配
//var result = from s in students
//                join c in courses on s.Id equals c.StudentId
//                select new { StudentName = s.Name, CourseName = c.Name };
// 輸出結果
foreach (var item in result)
{Console.WriteLine("{0}選了課程", item.StudentName);foreach (var n in item.CourseName){Console.WriteLine("課程為:{0}",n);}
}

運行結果為:

通過對比可以發現,join和groupjion的區別在于,join相當于左右一對一關系,例如:

左1=右1,左1=右2....這樣一一列舉,但groupjoin不一樣,他是以左一為關鍵字,將左一的值生成一個list,例如 左1={右1,右2}...,在實際應用中根據需求選用不同的用法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161138.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161138.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php如何實現文件上傳

php實現文件上傳需要通過全局變量&#xff08;數組&#xff09;&#xff1a;$_FILES 結合 move_uploaded_file 函數來實現。 move_uploaded_file函數&#xff08;只對POST方式生效&#xff09;&#xff1a; 其中move_uploaded_file函數語法&#xff1a;move_uploaded_file(需要…

Vue生成二維碼并進行二維碼圖片下載

1、安包 npm install vue-qr --save2、引入 // vue2.0 import VueQr from vue-qr // vue3.0 import VueQr from vue-qr/src/packages/vue-qr.vue new Vue({components: {VueQr} })<!-- 設備二維碼 對話框 270px--><el-dialog title"點位二維碼" :visible.…

超級簽名封號掉簽該怎么辦

如果超級簽名封號掉簽了&#xff0c;可以考慮以下幾種解決方法&#xff1a; 聯系簽名服務商&#xff1a;首先&#xff0c;可以聯系簽名服務商&#xff0c;了解封號的原因和解決方案。app封裝打包可能會提供技術支持或幫助恢復簽名。 檢查簽名配置&#xff1a;確認簽名配置是否…

練習題——【學習補檔】庫函數的模擬實現

各種庫函數的模擬實現 一、模擬實現strlen1.地址-地址型2.遞歸型3.計數器型 二、模擬實現strcpy三、模擬實現strcmp四、模擬實現strcat五、模擬實現strstr 一、模擬實現strlen 模擬實現strlen有三種方法 1.地址-地址型 2.遞歸型 3.計數器型1.地址-地址型 // //1.地址-地址型 …

云服務器-從零搭建前后端服務

使用須知 選擇0M帶寬不能訪問公網&#xff08;不分配公網IP&#xff09;&#xff0c;如需分配公網IP請增加帶寬值。云服務器ECS默認不開啟虛擬內存如您需要使用請登錄云服務器內部操作。Linux開啟swap&#xff08;虛擬內存&#xff09;、Windows虛擬內存的設置若您購買了數據盤…

含分布式電源的配電網可靠性評估matlab程序

微?關注“電氣仔推送”獲得資料&#xff08;專享優惠&#xff09; 參考文獻&#xff1a; 基于仿射最小路法的含分布式電源配電網可靠性分析——熊小萍 主要內容&#xff1a; 通過概率模型和時序模型分別進行建模&#xff0c;實現基于概率模型最小路法的含分布式電源配電網…

web需求記錄

需求1&#xff1a;根據后端傳過來的設備名:DESKTOP-4DQRGQB&#xff0c;以及mac:e0:be:03:74:40:0b&#xff1b;iQOO-8&#xff0c;mac:b0:33:66:38:c3:25&#xff0c;用web option 是動態增加的&#xff08;也就是那個選擇框里面的東西是根據后端傳過來的值動態增加的&#xf…

upload-labs關卡12(基于白名單的%00截斷繞過)通關思路

文章目錄 前言一、靶場需要了解的前置知識1、%00截斷2、0x00截斷3、00截斷的使用條件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶場第十二關通關思路1、看源代碼2、bp抓包%00截斷3、驗證文件是否上傳成功 總結 前言 此文章只用于學習和反思鞏固文件上傳漏洞知識&…

LL(1)語法分析程序設計與實現

制作一個簡單的C語言詞法分析程序_用c語言編寫詞法分析程序-CSDN博客文章瀏覽閱讀322次。C語言的程序中&#xff0c;有很單詞多符號和保留字。一些單詞符號還有對應的左線性文法。所以我們需要先做出一個單詞字符表&#xff0c;給出對應的識別碼&#xff0c;然后跟據對應的表格…

國民新旅游時代,OTA們如何制勝新周期?

文 | 螳螂觀察&#xff08;TanglangFin&#xff09; 作者 | 圖霖 消費全面復蘇的大背景下&#xff0c;旅游業正迎來預期中的拐點。 一個顯著表現是&#xff0c;旅游消費正在從可選消費轉化成必選消費。 國內消費者旅游需求的不降反增&#xff0c;就是最好的印證。 同程研究…

DoFaker: 一個簡單易用的換臉工具

DoFaker: 一個簡單易用的換臉工具 基于insightface開發&#xff0c;可以輕松替換視頻或圖片中的人臉。支持windows和linux系統&#xff0c;CPU和GPU推理。onnxruntime推理&#xff0c;無需pytorch。 更新 2023/9/16 更新動作遷移算法2023/9/14 更新臉部增強算法(GFPGAN)和超分…

TypeScript枚舉

1、數字枚舉 enum Direction {Up,Down,Left,Right, } var Direction; (function (Direction) {Direction[Direction["Up"] 0] "Up";Direction[Direction["Down"] 1] "Down";Direction[Direction["Left"] 2] "L…

[點云分割] 基于顏色的區域增長分割

效果&#xff1a; 代碼&#xff1a; #include <iostream> #include <thread> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/search.h> #include <pcl/search/kdtree.h> #inclu…

AR道具特效制作工具

AR&#xff08;增強現實&#xff09;技術已經逐漸滲透到各個行業&#xff0c;為企業帶來了全新的營銷方式和用戶體驗。在這個背景下&#xff0c;美攝科技憑借其強大的技術實力和創新精神&#xff0c;推出了一款專為企業打造的美攝AR特效制作工具&#xff0c;旨在幫助企業輕松實…

MIKE水動力筆記19_統計平均潮差

本文目錄 前言Step 1 ArcGIS中創建漁網點Step 2 將dfsu數據提取到漁網點Step 3 Python統計平均潮差 前言 日平均潮差&#xff08;average daily tidal range&#xff09;&#xff1a;日高潮潮高合計之和除以實有高潮個數為日平均高潮潮高&#xff0c;日低潮潮高合計之和除以實…

Quartz .Net 的簡單使用

參考了&#xff1a;c# .net framework 4.5.2 , Quartz.NET 3.0.7 - runliuv - 博客園 (cnblogs.com) https://www.cnblogs.com/personblog/p/11277527.html&#xff0c; Quartz.NET 作業調度&#xff08;一&#xff09;&#xff1a;Test - 簡書 自己要輪詢的任務&#xff1a…

NX二次開發UF_CAM_PREPRO_init_module 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREPRO_init_module Defined in: uf_cam_prepro.h int UF_CAM_PREPRO_init_module(void ) overview 概述 Initializes the required environment for this module. 初始化此…

淺談Python裝飾器原理與用法分析

前言 本文實例講述了Python裝飾器原理與用法。分享給大家供大家參考&#xff0c;具體如下&#xff1a; 1、裝飾器的本質是函數&#xff0c;主要用來裝飾其他函數&#xff0c;也就是為其他函數添加附加功能 2、裝飾器的原則: (1) 裝飾器不能修改被裝飾的函數的源代碼 (2) 裝…

VScode調試沒有反應

點擊調試按鈕后沒反應 有可能是vscode中安裝的python插件版本問題 可以通過重新安裝比較舊一點的python嘗試解決此問題 步驟如下&#xff1a; 然后從中選擇比當前版本更低的版本即可 安裝完成后需重啟vscode

初識EasyAR

EasyAR 一、介紹&#xff08;核心還是 目標圖像的屏占比&#xff09; 支持 EasyAR-AR|AR技術|AR SDK|Unity AR|下載 1.表面、圖片(靜止/運動)跟蹤&#xff0c;支持多目標 2.3D物體(靜止/運動)跟蹤(注&#xff1a;物體旋轉、遠近移動也可以&#xff0c;本人試過&#xff0c;…