C# Enumerable类 之 数据筛选
总目录
前言
在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合进行查询、转换、排序和聚合等操作。
本文属于 C# Enumerable类 使用详解 中的一个章节,着重介绍 C# Enumerable 类中数据筛选这部分的内容。
一、概览
方法 | 描述 | 示例 |
---|---|---|
Where | 条件过滤 | nums.Where(n => n > 10) |
OfType | 类型过滤 | list.OfType<string>() |
Distinct | 去重 | names.Distinct() |
二、Where
:条件过滤
1. 什么是Where
Where 是 LINQ 提供的一个扩展方法,用于根据指定的谓词(predicate)筛选集合中的元素。它适用于实现了 IEnumerable 接口的任何类型,包括数组、列表和其他可枚举集合。
2. where 方法 基本信息
1) Where
Where
用于从集合中筛选出满足特定条件的元素。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
- 参数:
source
:要筛选的源序列。predicate
:一个返回布尔值的函数,用于确定是否应包含某个元素。- 第一个重载仅传递元素本身给谓词函数。
- 第二个重载除了传递元素本身外,还传递该元素在序列中的索引位置。
- 返回值:一个包含满足谓词条件的元素的序列。
2)工作原理
Where
方法会遍历集合中的每个元素,并根据提供的谓词函数判断是否应包含该元素。如果谓词函数返回 true
,则该元素会被包含在结果集中;如果返回 false
,则忽略该元素。
3)使用场景
- 数据过滤:当需要从集合中筛选出满足某些条件的数据时,可以使用
Where
方法。 - 数据清洗:在处理用户输入或其他外部数据源时,筛选出有效或符合条件的数据。
- 性能优化:通过提前过滤掉不符合条件的数据,减少后续处理的数据量。
3. 使用示例
示例 1:基本用法
假设我们有一个包含数字的列表,我们可以使用 Where
方法筛选出偶数。
static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };var evenNumbers = numbers.Where(n => n % 2 == 0);Console.WriteLine(string.Join(",",evenNumbers));//输出:2,4,6}
在这个例子中,我们创建了一个包含数字的列表 numbers
,然后使用 Where
方法筛选出了所有偶数。
示例 2:复杂条件
我们可以在谓词函数中使用更复杂的逻辑来筛选数据。例如,筛选出所有偶数且小于10的数字。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };var filteredNumbers = numbers.Where(n => n % 2 == 0 && n < 10);foreach (var num in filteredNumbers){Console.WriteLine(num); // 输出: 2 4 6 8}}
}
在这个例子中,我们使用了复合条件来筛选出所有偶数且小于10的数字。
示例 3:结合其他 LINQ 方法
Where
可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 Where
方法筛选出符合条件的元素,然后再使用 Select
方法进行转换。
using System;
using System.Collections.Generic;
using System.Linq;class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 },new Person { Name = "David", Age = 20 }};var filteredPeople = people.Where(p => p.Age > 25) // 筛选出年龄大于25的人.Select(p => p.Name); // 只选择名字foreach (var name in filteredPeople){Console.WriteLine(name); // 输出: Alice Charlie}}
}
在这个例子中,我们首先使用 Where
方法筛选出了年龄大于25的人,然后使用 Select
方法只选择了这些人的名字。
示例 4:带索引的筛选
有时我们需要根据元素在序列中的索引来筛选数据。这时可以使用第二个重载的 Where
方法,它不仅传递元素本身,还传递该元素在序列中的索引位置。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<string> words = new List<string> { "apple", "banana", "cherry", "date", "elderberry" };var filteredWords = words.Where((word, index) => word.Length > 5 || index % 2 == 0);foreach (var word in filteredWords){Console.WriteLine(word); // 输出: apple cherry date elderberry}}
}
在这个例子中,我们使用了带索引的 Where
方法,筛选出了长度大于5的单词或者索引为偶数的单词。
示例 5:带索引的筛选解析
int[] numbers = { 0, 30, 20, 15, 90, 85, 40, 75 };IEnumerable<int> query =numbers.Where((number, index) => number <= index * 10);foreach (int number in query)
{Console.WriteLine(number);
}
/*This code produces the following output:0201540
*/
- 第一个参数
number
表示要测试的元素。 第二个参数表示 中index
元素的从零开始的索引。 - 过滤过程,根据条件计算:
- 索引0:0 <= 0×10 → 0(保留)
- 索引1:30 <= 1×10 → 30>10(舍弃)
- 索引2:20 <= 2×10 → 20<=20(保留)
- 索引3:15 <=3×10 → 15<=30(保留)
- 索引4:90 <=4×10 → 90>40(舍弃)
- 索引5:85 <=5×10 → 85>50(舍弃)
- 索引6:40 <=6×10 → 40<=60(保留)
- 索引7:75 <=7×10 → 75>70(舍弃)
- 最终输出:0 20 15 40。
示例 6:自定义对象
当我们处理自定义对象时,可以根据对象的属性进行筛选。例如,筛选出所有年龄大于30岁的人。
using System;
using System.Collections.Generic;
using System.Linq;class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 },new Person { Name = "David", Age = 20 }};var filteredPeople = people.Where(p => p.Age > 30);foreach (var person in filteredPeople){Console.WriteLine($"{person.Name} ({person.Age})"); // 输出: Charlie (35)}}
}
在这个例子中,我们根据 Person
对象的 Age
属性筛选出了所有年龄大于30岁的人。
4. 注意事项
尽管 Where
方法非常有用,但在实际应用中也有一些需要注意的地方:
- 延迟执行:
Where
方法是延迟执行的,这意味着它不会立即对集合进行筛选操作,而是返回一个查询表达式。只有在实际遍历结果集时,才会执行筛选操作。这种设计可以提高性能,特别是在处理大型集合时。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };var query = numbers.Where(n => n > 3);Console.WriteLine("Before modifying the list:");foreach (var num in query){Console.WriteLine(num); // 输出: 4 5}numbers.Add(6);Console.WriteLine("After modifying the list:");foreach (var num in query){Console.WriteLine(num); // 输出: 4 5 6}}
}
在这个例子中,我们看到即使在第一次遍历之后修改了原始集合,第二次遍历时仍然包含了新添加的元素。
-
谓词函数的性能:谓词函数的复杂度直接影响到
Where
方法的性能。尽量保持谓词函数简单高效,避免在谓词函数中执行耗时的操作。 -
不可变性:
Where
方法不会修改原始集合,而是返回一个新的集合。这意味着原始集合保持不变,新的集合只包含满足条件的元素。 -
空集合处理: 如果源集合为空,
Where
方法将返回一个空的结果集。因此,在使用Where
方法之前,通常不需要检查集合是否为空。
三、 OfType
:类型过滤
1. 什么是 OfType
OfType<T>
方法是 LINQ 提供的一个扩展方法,用于从集合中筛选出可以转换为指定类型的元素。它可以帮助我们在多态集合中提取特定类型的对象,过滤掉无法转换的元素。
2. OfType方法 基本信息
1)OfType
public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);
- 参数:
source
表示要筛选的源集合。 - 返回值:一个包含可以转换为指定类型的元素的
IEnumerable<TResult>
。
2)工作原理:
OfType<T>
方法会遍历集合中的每个元素,并尝试将其转换为目标类型 TResult
。如果转换成功,则该元素会被包含在结果集中;如果转换失败(例如元素不是目标类型的实例),则该元素会被忽略。
2)使用场景
- 多态集合:当集合中包含多种类型的对象时,可以使用
OfType<T>
提取特定类型的对象。 - 接口和基类:当集合中包含实现某个接口或继承自某个基类的对象时,可以使用
OfType<T>
过滤出特定类型或接口的实例。 - 类型安全操作:在对集合进行操作之前,确保所有元素都是期望的类型,避免运行时类型转换异常。
3. 使用示例
示例 1:基本用法
假设我们有一个包含不同类型的对象的集合,我们可以使用 OfType<T>
提取出特定类型的对象。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<object> mixedList = new List<object>{1,"Hello",2.5,true,"World"};var strings = mixedList.OfType<string>();foreach (var str in strings){Console.WriteLine(str); // 输出: Hello World}}
}
在这个例子中,我们创建了一个包含不同类型对象的列表 mixedList
,然后使用 OfType<string>()
提取了所有字符串类型的元素。
示例 2:多态集合
假设我们有一个包含多个派生类对象的集合,可以使用 OfType<T>
提取特定派生类的实例。
using System;
using System.Collections.Generic;
using System.Linq;class Animal { }
class Dog : Animal { }
class Cat : Animal { }class Program
{static void Main(){List<Animal> animals = new List<Animal>{new Dog(),new Cat(),new Dog(),new Cat()};var dogs = animals.OfType<Dog>();foreach (var dog in dogs){Console.WriteLine("Dog instance found"); // 输出: Dog instance found Dog instance found}}
}
在这个例子中,我们创建了一个包含 Dog
和 Cat
对象的集合 animals
,然后使用 OfType<Dog>()
提取了所有 Dog
类型的实例。
示例 3:接口集合
假设我们有一个包含实现了某个接口的对象的集合,可以使用 OfType<T>
提取实现该接口的对象。
using System;
using System.Collections.Generic;
using System.Linq;interface IAnimal
{void Speak();
}class Dog : IAnimal
{public void Speak() => Console.WriteLine("Woof!");
}class Cat : IAnimal
{public void Speak() => Console.WriteLine("Meow!");
}class Program
{static void Main(){List<object> mixedList = new List<object>{new Dog(),new Cat(),"Hello",42};var animals = mixedList.OfType<IAnimal>();foreach (var animal in animals){animal.Speak(); // 输出: Woof! Meow!}}
}
在这个例子中,我们创建了一个包含不同类型的对象的列表 mixedList
,然后使用 OfType<IAnimal>()
提取了所有实现了 IAnimal
接口的对象,并调用了它们的 Speak
方法。
示例 4:结合其他 LINQ 方法
OfType<T>
可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 OfType<T>
提取特定类型的对象,然后再使用 Select
或 Where
等方法进行进一步处理。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<object> mixedList = new List<object>{1,"Hello",2.5,true,"World"};var upperStrings = mixedList.OfType<string>().Select(s => s.ToUpper());foreach (var str in upperStrings){Console.WriteLine(str); // 输出: HELLO WORLD}}
}
在这个例子中,我们首先使用 OfType<string>()
提取所有字符串类型的元素,然后使用 Select
方法将这些字符串转换为大写形式。
4. 注意事项
-
性能考虑:OfType 会遍历整个集合并尝试对每个元素进行类型转换。如果集合非常大,这可能会导致性能问题。因此,在处理大型集合时,应谨慎使用,并根据具体需求选择合适的方法。
-
类型安全性:虽然 OfType 可以帮助我们过滤出特定类型的元素,但它并不能防止所有类型的错误。例如,如果集合中包含不兼容类型的对象,这些对象会被忽略,但不会引发异常。因此,在使用 OfType 时,仍然需要确保集合中的数据符合预期。
-
与
Cast<T>
的区别Cast<T>
:尝试将集合中的每个元素强制转换为指定类型。如果转换失败,会抛出InvalidCastException
。OfType<T>
:仅保留可以成功转换为指定类型的元素,忽略无法转换的元素。- 因此,
OfType<T>
更加灵活和安全,特别是在处理可能包含多种类型对象的集合时。
四、Distinct:去重
1. 什么是 Distinct
Distinct 是 LINQ 提供的一个扩展方法,用于从集合中筛选出唯一的元素,去除重复项。它适用于实现了 IEnumerable 接口的任何类型,包括数组、列表和其他可枚举集合。
2. Distinct
方法基本信息
1)Distinct
Distinct
用于从集合中去除重复的元素。
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
- 参数:
source
:要筛选的源序列。comparer
(可选):用于比较元素的IEqualityComparer<T>
实现。
- 返回值:一个包含唯一元素的序列。
2) 工作原理
Distinct
方法会遍历集合中的每个元素,并使用默认的或自定义的比较器来判断元素是否已经存在于结果集中。如果元素是唯一的,则将其添加到结果集中;如果元素已经存在,则忽略该元素。
3)使用场景
- 去除重复数据:当集合中包含重复的数据时,可以使用
Distinct
方法去除这些重复项。 - 数据清洗:在处理用户输入或其他外部数据源时,去除重复项有助于提高数据质量。
- 性能优化:在某些高性能应用场景中,去除重复项可以减少不必要的计算和内存占用。
3. 使用示例
示例 1:基本用法
假设我们有一个包含重复数字的列表,我们可以使用 Distinct
方法去除这些重复项。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };var distinctNumbers = numbers.Distinct();foreach (var num in distinctNumbers){Console.WriteLine(num); // 输出: 1 2 3 4 5}}
}
在这个例子中,我们创建了一个包含重复数字的列表 numbers
,然后使用 Distinct
方法去除了重复项。
示例 2:自定义对象去重
当我们处理自定义对象时,默认情况下,Distinct
方法会使用对象的引用进行比较。为了实现基于对象属性的比较,我们需要提供一个自定义的 IEqualityComparer<T>
实现。
定义自定义类
class Person
{public string Name { get; set; }public int Age { get; set; }
}
自定义比较器
class PersonComparer : IEqualityComparer<Person>
{public bool Equals(Person x, Person y){if (x == null && y == null) return true;if (x == null || y == null) return false;return x.Name == y.Name && x.Age == y.Age;}public int GetHashCode(Person obj){if (obj == null) return 0;int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();int hashAge = obj.Age.GetHashCode();return hashName ^ hashAge;}
}
使用自定义比较器
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Alice", Age = 30 }, // 重复项new Person { Name = "Charlie", Age = 35 }};var distinctPeople = people.Distinct(new PersonComparer());foreach (var person in distinctPeople){Console.WriteLine($"{person.Name} ({person.Age})"); // 输出: Alice (30), Bob (25), Charlie (35)}//简化输出Console.WriteLine(string.Join(",",distinctPeople.Select(x=>$"{x.Name} ({x.Age})")));}
}
在这个例子中,我们定义了一个自定义类 Person
和一个自定义比较器 PersonComparer
,然后使用 Distinct
方法去除了重复的 Person
对象。
相反,如果不定义 自定义比较器 PersonComparer
,是无法对 自定义 Person
对象进行去重的。
示例 3:结合其他 LINQ 方法
Distinct
可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 Select
方法提取特定属性,然后再使用 Distinct
方法去除重复项。
using System;
using System.Collections.Generic;
using System.Linq;class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Alice", Age = 30 }, // 重复项new Person { Name = "Charlie", Age = 35 }};var uniqueNames = people.Select(p => p.Name).Distinct();foreach (var name in uniqueNames){Console.WriteLine(name); // 输出: Alice, Bob, Charlie}}
}
在这个例子中,我们首先使用 Select
方法提取了所有人的名字,然后使用 Distinct
方法去除了重复的名字。
示例 4:字符串集合
假设我们有一个包含重复字符串的集合,我们可以使用 Distinct
方法去除这些重复项。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<string> words = new List<string> { "apple", "banana", "apple", "orange", "banana" };var distinctWords = words.Distinct();foreach (var word in distinctWords){Console.WriteLine(word); // 输出: apple, banana, orange}}
}
在这个例子中,我们创建了一个包含重复字符串的列表 words
,然后使用 Distinct
方法去除了重复项。
4. 注意事项
尽管 Distinct
方法非常有用,但在实际应用中也有一些需要注意的地方:
- 性能考虑:
Distinct
方法会遍历整个集合并存储已经遇到的元素。对于大型集合,这可能会导致性能问题。因此,在处理大型集合时,应谨慎使用,并根据具体需求选择合适的方法。 - 默认比较器: 默认情况下,
Distinct
方法使用对象的Equals
和GetHashCode
方法进行比较。对于自定义对象,如果没有重写这些方法,Distinct
可能无法正确识别重复项。 - 自定义比较器: 如果需要基于对象的某个属性进行比较,必须提供一个自定义的
IEqualityComparer<T>
实现。否则,Distinct
方法将无法正确识别重复项。 - 不可变性:
Distinct
方法不会修改原始集合,而是返回一个新的集合。这意味着原始集合保持不变,新的集合只包含唯一的元素。
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
微软官方文档 Enumerable
相关文章:
C# Enumerable类 之 数据筛选
总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…...

Grafana服务安装并启动
Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍:Grafana是一个开源的可视化系统监控和警报工具包…...

蓝桥杯web第三天
展开扇子题目, #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子,子元素旋转 webkit display: -webkit-box:将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical:设置伸缩盒子的子元素排列方…...
C#开发——时间间隔类TimSpan
TimeSpan 是 C# 中的一个结构( struct ),用于表示时间间隔或持续时间。它位于 System 命名空间中,是处理时间相关操作时非常重要的工具,尤其是在计算两个日期或时间之间的差值、表示时间段或执行时间相关的运算…...

NModbus 连接到Modbus服务器(Modbus TCP)
1、在项目中通过NuGet添加NModbus,在界面中添加一个Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…...

蓝桥杯 之 图形规律
文章目录 分析组成,找到规律数正方形 在蓝桥杯中,常常会有一些图形的规律的题目需要我们去解决,所以我们需要学会其中的一些方法,我们这样才能解决对应的问题 方法1:直接对n进行拆分方法2:使用递归的思路&a…...
多线程学习之路
多线程的创建方式主要有以下几种: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 class MyThread extends Thread {Overridepublic void run() {// 线程执行的任务System.out.println("Thread is running");} }public class Mai…...

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会
2025年2月28日,第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题,重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴,英码科技…...
【AI】如何理解与应对AI中的敏感话题:详细分析与实用指南
引言 随着人工智能(AI)技术的不断发展,我们在与AI交互时,可能会遇到敏感话题的讨论限制。在许多情况下,AI系统为了避免触及社会、政治或文化敏感点,会对用户输入进行一定的筛选和过滤。那么,这…...

(十 三)趣学设计模式 之 模版方法模式!
目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…...

20250225-代码笔记03-class CVRPModel AND other class
文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…...

【postman】postman找回接口数据
项目提测,一打开postman天塌了,所有接口都不见了。。。。conllection目录也看不见了,也导入不了同事给我发的json文件。 然后重新找同事要了一个安装包,覆盖安装了之后,在下面的目录里面找到了备份文件【C:\Users\yan…...

Milvus向量数据库部署
一、什么是Milvus Milvus 是一款开源的向量数据库,旨在帮助开发者轻松管理和检索大规模向量数据。它通过高效的索引技术,支持快速的相似度搜索,使得从海量数据中查找最接近的匹配变得简单而快捷。无论是构建推荐系统、进行图像识别还是分析自…...

显式 GC 的使用:留与去,如何选择?
目录 一、什么是显式 GC? (一) 垃圾回收的基本原理 (二)显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 (三)显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…...

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...

从零实现高并发内存池
目录 一、项目介绍 二、什么是内存池? 1.池化技术 2.内存池 3.内存池解决的问题 三、malloc本身就是内存池 四、定长内存池 五、高并发内存池整体框架 六、thread cache 七、central cache 八、page cache 一、项目介绍 当前项目是实现一个高并发的内存池…...
3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

【计算机网络】考研复试高频知识点总结
文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …...

IDEA Tab 页设置多行显示
前言 日常编码中,经常需要在编辑器中同时打开多个文件,而在 IDEA 中,默认情况下,顶部的 Tab 页只显示一行,多余的文件会被隐藏起来,如下图所示: IDEA 默认 Tab 页只显示一行 这种情况下&#…...
Spark核心之02:常用算子详解
1、RDD操作详解 # 启动spark-shell spark-shell --master local[2] 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例: scala> val a sc.parallelize(1 …...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...