当前位置: 首页 > news >正文

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}}
}

在这个例子中,我们创建了一个包含 DogCat 对象的集合 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> 提取特定类型的对象,然后再使用 SelectWhere 等方法进行进一步处理。

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 方法使用对象的 EqualsGetHashCode 方法进行比较。对于自定义对象,如果没有重写这些方法,Distinct 可能无法正确识别重复项。
  • 自定义比较器: 如果需要基于对象的某个属性进行比较,必须提供一个自定义的 IEqualityComparer<T> 实现。否则,Distinct 方法将无法正确识别重复项。
  • 不可变性Distinct 方法不会修改原始集合,而是返回一个新的集合。这意味着原始集合保持不变,新的集合只包含唯一的元素。

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
微软官方文档 Enumerable

相关文章:

C# Enumerable类 之 数据筛选

总目录 前言 在 C# 中&#xff0c;System.Linq.Enumerable 类是 LINQ&#xff08;Language Integrated Query&#xff09;的核心组成部分&#xff0c;它提供了一系列静态方法&#xff0c;用于操作实现了 IEnumerable 接口的集合。通过这些方法&#xff0c;我们可以轻松地对集合…...

Grafana服务安装并启动

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

蓝桥杯web第三天

展开扇子题目&#xff0c; #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子&#xff0c;子元素旋转 webkit display: -webkit-box&#xff1a;将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical&#xff1a;设置伸缩盒子的子元素排列方…...

C#开发——时间间隔类TimSpan

TimeSpan 是 C# 中的一个结构&#xff08; struct &#xff09;&#xff0c;用于表示时间间隔或持续时间。它位于 System 命名空间中&#xff0c;是处理时间相关操作时非常重要的工具&#xff0c;尤其是在计算两个日期或时间之间的差值、表示时间段或执行时间相关的运算…...

NModbus 连接到Modbus服务器(Modbus TCP)

1、在项目中通过NuGet添加NModbus&#xff0c;在界面中添加一个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…...

蓝桥杯 之 图形规律

文章目录 分析组成&#xff0c;找到规律数正方形 在蓝桥杯中&#xff0c;常常会有一些图形的规律的题目需要我们去解决&#xff0c;所以我们需要学会其中的一些方法&#xff0c;我们这样才能解决对应的问题 方法1&#xff1a;直接对n进行拆分方法2&#xff1a;使用递归的思路&a…...

多线程学习之路

多线程的创建方式主要有以下几种&#xff1a; 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 class MyThread extends Thread {Overridepublic void run() {// 线程执行的任务System.out.println("Thread is running");} }public class Mai…...

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会

2025年2月28日&#xff0c;第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题&#xff0c;重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴&#xff0c;英码科技…...

【AI】如何理解与应对AI中的敏感话题:详细分析与实用指南

引言 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;我们在与AI交互时&#xff0c;可能会遇到敏感话题的讨论限制。在许多情况下&#xff0c;AI系统为了避免触及社会、政治或文化敏感点&#xff0c;会对用户输入进行一定的筛选和过滤。那么&#xff0c;这…...

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式&#xff1f;二、 为什么要用模板方法模式&#xff1f;三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&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找回接口数据

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

Milvus向量数据库部署

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

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC&#xff1f; &#xff08;一&#xff09; 垃圾回收的基本原理 &#xff08;二&#xff09;显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 &#xff08;三&#xff09;显式 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 算法代码示例…...

从零实现高并发内存池

目录 一、项目介绍 二、什么是内存池&#xff1f; 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 页设置多行显示

前言 日常编码中&#xff0c;经常需要在编辑器中同时打开多个文件&#xff0c;而在 IDEA 中&#xff0c;默认情况下&#xff0c;顶部的 Tab 页只显示一行&#xff0c;多余的文件会被隐藏起来&#xff0c;如下图所示&#xff1a; IDEA 默认 Tab 页只显示一行 这种情况下&#…...

Spark核心之02:常用算子详解

1、RDD操作详解 # 启动spark-shell spark-shell --master local[2] 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例&#xff1a; scala> val a sc.parallelize(1 …...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...