unity C# 中通俗易懂LINQ使用案例

文章目录

    • 1. 从数组或列表中查询元素**:
    • 2. **排序与分组**:
    • 3. **连接多个数据源**:
    • 4. **聚合操作**:
    • 5. **分页查询**:
    • 6. **多条件查询**:
    • 7. **转换和投影(Select)**:
    • 8. **聚合函数(GroupBy 和 Aggregate)**:
    • 9. **组合查询(Concat)**:
    • 10. **Distinct 查询**:
    • 11. **元素存在性检查(Any 和 All)**:
    • 12. **Join 多个数据源**:

C# 中的 LINQ语句可以使得我们使用简短的代码就可以完成排序、分类、查询等常用功能。以下是一些基本的 C# LINQ 使用案例:

1. 从数组或列表中查询元素**:

假设我们有一个整数数组,想要找出所有的偶数。

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2 };

var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var number in evenNumbers)
{
    Console.WriteLine(number);
}

上述代码使用 Where 方法过滤出所有偶数。

2. 排序与分组

如果我们有一个学生类 Student 包含 NameGrade 属性,并且有一个学生列表,我们可以按年级排序并分组。

class Student
{
    public string Name { get; set; }
    public int Grade { get; set; }
}

List<Student> students = new List<Student>
{
    new Student { Name = "Alice", Grade = 9 },
    new Student { Name = "Bob", Grade = 10 },
    // 更多学生...
};

var sortedStudents = students.OrderBy(s => s.Grade);
var groupedStudents = students.GroupBy(s => s.Grade);

// 输出每个年级的学生
foreach (var group in groupedStudents)
{
    Console.WriteLine($"Grade: {group.Key}");
    foreach (var student in group)
    {
        Console.WriteLine($"\t{Name}:");
    }
}

3. 连接多个数据源

这是一个复合查询的例子,假设我们有两个数据源:一个包含学生信息的列表和另一个包含课程成绩的列表,它们通过学生ID关联。

class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Grade
{
    public int StudentID { get; set; }
    public string Course { get; set; }
    public double Score { get; set; }
}

List<Student> students = new List<Student>();
List<Grade> grades = new List<Grade>();

// 填充数据...

var studentGrades = from student in students
                    join grade in grades on student.ID equals grade.StudentID
                    select new { student.Name, grade.Course, grade.Score };

foreach (var item in studentGrades)
{
    Console.WriteLine($"{item.Name}{item.Course} 的成绩是 {item.Score}");
}

4. 聚合操作

计算列表中的总和、平均值、最大值或最小值。

var sum = numbers.Sum();
var average = numbers.Average();
var max = numbers.Max();
var min = numbers.Min();

Console.WriteLine($"Sum: {sum}, Average: {average}, Max: {max}, Min: {min}");

5. 分页查询

假设我们有一个大型的用户列表,并希望分页显示。

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 更多属性...
}

List<User> users = new List<User>(); // 假设有大量用户数据

int pageSize = 10;
int currentPage = 2;

var paginatedUsers = users.Skip((currentPage - 1) * pageSize).Take(pageSize);

foreach (var user in paginatedUsers)
{
    Console.WriteLine($"{user.Id}: {user.Name}");
}

6. 多条件查询

对于一个包含产品信息的列表,我们可以根据多个条件进行筛选。

class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public bool IsAvailable { get; set; }
}

List<Product> products = new List<Product>();

var filteredProducts = products
    .Where(p => p.IsAvailable && p.Price > 100m && p.Name.Contains("Smartphone"))
    .OrderByDescending(p => p.Price);

foreach (var product in filteredProducts)
{
    Console.WriteLine($"{product.Name} - ${product.Price}");
}

7. 转换和投影(Select)

只选择或转换对象中的某些属性。

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

List<Person> people = new List<Person>();

var personNames = people.Select(p => $"{p.FirstName} {p.LastName}");

foreach (var name in personNames)
{
    Console.WriteLine(name);
}

8. 聚合函数(GroupBy 和 Aggregate)

计算每个类别(如按年龄分组)的数量,或者对一组值应用累计计算。

var ageGroups = people.GroupBy(p => p.Age)
                      .Select(g => new { Age = g.Key, Count = g.Count() });

foreach (var group in ageGroups)
{
    Console.WriteLine($"Age: {group.Age}, Count: {group.Count}");
}

double totalAge = people.Sum(p => p.Age);
Console.WriteLine($"Total age of all people: {totalAge}");

int oldestPersonAge = people.Aggregate((currentMax, next) => currentMax.Age > next.Age ? currentMax : next).Age;
Console.WriteLine($"Oldest person's age: {oldestPersonAge}");

9. 组合查询(Concat)

将两个数据源合并为一个。

List<int> numbers1 = new List<int> { 1, 2, 3 };
List<int> numbers2 = new List<int> { 4, 5, 6 };

var combinedNumbers = numbers1.Concat(numbers2);

foreach (var number in combinedNumbers)
{
    Console.WriteLine(number);
}

10. Distinct 查询

删除重复项,返回唯一值的序列。

```csharp
List<string> words = new List<string> { "apple", "banana", "apple", "orange", "banana" };

var uniqueWords = words.Distinct();

foreach (var word in uniqueWords)
{
    Console.WriteLine(word);
}
```

11. 元素存在性检查(Any 和 All)

检查集合中是否存在满足条件的任何元素或所有元素都满足条件。

```csharp
bool hasEvenNumber = numbers.Any(n => n % 2 == 0);
Console.WriteLine($"是否有偶数:{hasEvenNumber}");

bool allNumbersGreaterThanZero = numbers.All(n => n > 0);
Console.WriteLine($"是否所有数字都大于零:{allNumbersGreaterThanZero}");
```

12. Join 多个数据源

假设我们有两个不同类型的列表,通过某个公共属性关联它们。

```csharp
class Order
{
    public int CustomerId { get; set; }
    public decimal TotalPrice { get; set; }
}

class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

List<Order> orders = new List<Order>();
List<Customer> customers = new List<Customer>();

var customerOrders = from order in orders
                     join customer in customers on order.CustomerId equals customer.Id
                     select new { CustomerName = customer.Name, OrderTotal = order.TotalPrice };

foreach (var item in customerOrders)
{
    Console.WriteLine($"{item.CustomerName} 的订单总价是 ${item.OrderTotal}");
}
```

以上就是更多关于C# LINQ使用的案例,实际上LINQ的功能远不止这些,它能极大地简化和优化对各种数据源的操作。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jdbc源码研究

JDBC介绍 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。 开发者不必为每家数据通信协议的不同而疲于奔命&#…

竞赛保研 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

Flask 会员列表展示

感谢编程浪子师傅的源码信息分享 web/controllers/member/Member.py # -*- coding: utf-8 -*- from flask import Blueprint,request,redirect,jsonify from common.libs.Helper import ops_render,iPagination,getCurrentDate,getDictFilterField,selectFilterObj from comm…

【uniapp】APP打包上架应用商-注意事项

初雪云-uniapp启动图自定义生成&#xff08;支持一键生成storyboard&#xff09; 一、修改App端上传图片/视频 uni.uploadFile let thatthis; uni.chooseImage({count: 1,sourceType: [camera,album],sizeType: [compressed, original],success: rey > {uni.showLoading({ t…

Linux操作系统——进程控制(一) 进程创建和进程终止

进程创建 fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff…

BetaFlight开源代码之电流校准

BetaFlight开源代码之电流校准 1. 源由2. 分析2.1 常规逻辑2.2 数据流2.3 采样电路2.3.1 采样实现2.3.2 采样原理2.3.3 Layout参考2.3.4 INA169芯片2.3.5 INA169 Near-Zero Vsense 3. 原理4. 示例4.1 实测&转换数据4.2 线性拟合-小电流4.3 线性拟合-大电流4.4 大电流/小电流…

HDMI彩条显示实验与方块移动实验

一、HDMI接口简介 一种数字音视频接口标准&#xff0c;提供高质量的数字音视频传输&#xff0c;同时支持多通道音频、高分辨率视频和其他数据传输功能。提供更高的数据传输带宽&#xff08;带宽&#xff1a;1s内传输多少比特数据&#xff09; 数字传输&#xff1a; HDMI是一种全…

【VRTK】启用多种VR设备的Passthrough功能

【背景】 透视可以让VR头盔展现AR能力,通过VRTK,可以快速实现多种设备平台可用的透视功能。包括主流的Oculus,Pico等。整个不成不需要自己写代码。 【操作】 针对WaveXR,点击场景中的CameraRigsWaveXR-》WaveRig-》Camera Offset-》Main Camera,追加一个新组件,名为Und…

QT自定义信号和槽

信号和槽 介绍实现创建文件对teacher的h和cpp文件进行处理对student的h和cpp文件进行处理对widget的h和cpp文件进行处理 介绍 Qt中的信号和槽是一种强大的机制&#xff0c;用于处理对象之间的通信。它们是Qt框架中实现事件驱动编程的核心部分。 信号&#xff08;Signal&#x…

vite4项目中,vant兼容750适配

一般非vite项目&#xff0c;使用postcss-px-to-viewport。在设计稿为750时候&#xff0c;可使用以下配置兼容vant。 在vite4项目中&#xff0c;以上配置不行。需要调整下&#xff0c;使用postcss-px-to-viewport-8-plugin&#xff0c;并修改viewportWidth&#xff0c;具体如下…

51单片机定时/计数器相关知识点

51单片机定时/计数器相关知识点 结构组成 51单片机的定时/计数器中有两个寄存器&#xff1a; T0&#xff1a;低位&#xff1a;TL0&#xff08;字节地址8AH&#xff09;高位&#xff1a;TH0&#xff08;字节地址8CH&#xff09;T1&#xff1a;低位&#xff1a;TL1&#xff08…

走向云原生 破局数字化

近年来&#xff0c;随着云计算概念和技术的普及&#xff0c;云原生一词也越来越热门&#xff0c;云原生成为云计算领域的新变量。行业内&#xff0c;华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外&#xff0c;云原生也逐渐出圈&#xff0c;出现在大众视野…

Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用

前言 前段时间微软发布了适用于VS Code的C#开发工具包&#xff08;注意目前该包还属于预发布状态但是可以正常使用&#xff09;&#xff0c;因为之前看过网上的一些使用VS Code搭建.NET Core环境的教程看着还挺复杂的就一直没有尝试使用VS Code来编写.NET Core。不过听说C# 开发…

设计模式Java实战,彻底学会

​这是全网最强的Java设计模式实战教程。此教程用实际项目场景&#xff0c;结合SpringBoot&#xff0c;让你真正掌握设计模式。 网址是&#xff1a;Java设计模式实战专栏介绍 - 自学精灵&#xff08;也可以百度搜索“自学精灵”&#xff09;。 本设计模式专栏的威力 用Java实…

MySQL学习笔记2: MySQL的前置知识

目录 1. MySQL是什么?2. 什么是客户端&#xff0c;什么是服务器&#xff1f;3. 服务器的特点4. 安装mysql5. mysql 客户端6. mysql 服务器7. mysql的本体8. MySQL 使用什么来存储数据&#xff1f;9. 数据库的多种含义10. MySQL 存储数据的组织方式 1. MySQL是什么? MySQL 是…

算法每日一题: 被列覆盖的最多行数 | 二进制 - 状态压缩

大家好&#xff0c;我是星恒 今天的题目又是一道有关二进制的题目&#xff0c;有我们之前做的那道 参加考试的最大学生数的 感觉&#xff0c;哈哈&#xff0c;当然&#xff0c;比那道题简单多了&#xff0c;这道题感觉主要的考点就是二进制&#xff0c;大家可以好好总结一下这道…

使用 Maven 的 dependencyManagement 管理项目依赖项

使用 Maven 的 dependencyManagement 管理项目依赖项 介绍 在开发 Java 项目时&#xff0c;管理和协调依赖项的版本号是一项重要而繁琐的任务。 而 Maven 提供了 <dependencyManagement> 元素&#xff0c;用于定义项目中所有依赖项的版本。它允许您指定项目中每个依赖…

Java网络编程 、UDP、TCP、Socket通信

这个是第一篇&#xff0c;我先写udp&#xff0c; 首先我解释一下这个的特点是什么&#xff0c;他的特点主要是&#xff1a; 我发送消息之后就不管这个消息的任何情况&#xff0c;也就是&#xff0c;我只要把这个消息发送出去就不管了 这个是大白话的解释&#xff0c;具体的就…

el 消除inpu输入框内容和下拉内容

输入这个就好了,clearable @clear="getList()" 非常简单 <span class="type-box"><span class="label">订单状态</span><el-select v-model="params.orderStatus" placeholder="请选择" class=&…

openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位

文章目录 openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位188.1 磁盘满故障引起的core问题188.1.1 问题现象188.1.2 原因分析188.1.3 处理办法 188.2 GUC参数log_directory设置不正确引起的core问题188.2.1 问题现象188.2.2 原因分析188.2.3 处理办…