C#扩展方法与Lambda表达式基本用法
C# 扩展方法与 Lambda 表达式详解
一、扩展方法详解
1. 基本概念
扩展方法允许为现有类型"添加"方法,而无需修改原始类型或创建派生类型。
定义条件:
- 必须在静态类中定义
- 方法本身必须是静态的
- 第一个参数使用
this
修饰符指定要扩展的类型
示例:
public static class StringExtensions
{// 扩展string类型的方法public static bool IsNullOrEmpty(this string str){return string.IsNullOrEmpty(str);}// 扩展int类型的方法public static bool IsEven(this int number){return number % 2 == 0;}
}// 使用
string s = "test";
Console.WriteLine(s.IsNullOrEmpty()); // Falseint num = 4;
Console.WriteLine(num.IsEven()); // True
2. 高级用法
(1) 扩展泛型方法
public static class EnumerableExtensions
{public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T> source) where T : class{return source.Where(item => item != null);}public static IEnumerable<T?> WhereNotNull<T>(this IEnumerable<T?> source) where T : struct{return source.Where(item => item.HasValue).Select(item => item.Value);}
}// 使用
var strings = new List<string?> { "a", null, "b" };
var nonNullStrings = strings.WhereNotNull(); // 返回 "a", "b"
(2) 扩展索引器
public static class DictionaryExtensions
{public static TValue GetOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue = default){return dictionary.TryGetValue(key, out var value) ? value : defaultValue;}
}// 使用
var dict = new Dictionary<string, int> { { "one", 1 }, { "two", 2 } };
Console.WriteLine(dict.GetOrDefault("one")); // 1
Console.WriteLine(dict.GetOrDefault("three", 0)); // 0
(3) 扩展异步方法
public static class AsyncExtensions
{public static async Task<T> WithTimeout<T>(this Task<T> task, TimeSpan timeout){using var timeoutCancellationTokenSource = new CancellationTokenSource();var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));if (completedTask == task){timeoutCancellationTokenSource.Cancel();return await task;}throw new TimeoutException("The operation has timed out.");}
}// 使用
var result = await SomeAsyncOperation().WithTimeout(TimeSpan.FromSeconds(5));
3. 最佳实践
-
命名规范:
- 扩展方法名应清晰表明其功能
- 避免与现有方法名冲突
-
静态类组织:
- 按功能分组相关扩展方法
- 考虑按扩展类型命名静态类(如
StringExtensions
)
-
文档注释:
/// <summary> /// 检查字符串是否为null或空 /// </summary> /// <param name="str">要检查的字符串</param> /// <returns>如果字符串为null或空则返回true</returns> public static bool IsNullOrEmpty(this string str)
-
性能考虑:
- 避免在扩展方法中执行昂贵操作
- 考虑延迟执行(如使用
yield return
)
-
避免过度使用:
- 不应滥用扩展方法来"修复"不良API设计
- 优先考虑继承或组合等更明确的设计模式
二、Lambda表达式详解
1. 基本语法
基本形式:
(参数列表) => 表达式或语句块
示例:
// 表达式Lambda
Func<int, int> square = x => x * x;// 语句Lambda
Action<string> greet = name =>
{Console.WriteLine($"Hello, {name}!");
};greet("World"); // 输出: Hello, World!
2. 类型推断
编译器可以自动推断Lambda表达式的参数类型:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // n自动推断为int
3. 多参数Lambda
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 5)); // 输出: 8
4. 无参数Lambda
Action sayHello = () => Console.WriteLine("Hello!");
sayHello(); // 输出: Hello!
5. 返回值Lambda
Func<int, int, int> multiply = (x, y) =>
{int result = x * y;return result;
};
6. 复杂Lambda表达式
Func<int, bool> isEven = x =>
{if (x % 2 == 0)return true;elsereturn false;
};
三、扩展方法与Lambda结合使用
1. 在扩展方法中使用Lambda
public static class EnumerableExtensions
{public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, bool condition, Func<T, bool> predicate){return condition ? source.Where(predicate) : source;}
}// 使用
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var result = numbers.WhereIf(true, x => x > 2); // 返回3,4,5
2. 高阶函数返回Lambda
public static class FunctionFactory
{public static Func<int, int> CreateMultiplier(int factor){return x => x * factor;}
}// 使用
var double = FunctionFactory.CreateMultiplier(2);
Console.WriteLine(double(5)); // 输出: 10
3. 延迟执行与Lambda
public static class LazyExtensions
{public static IEnumerable<T> LazySelect<T>(this IEnumerable<T> source, Func<T, T> selector){foreach (var item in source){yield return selector(item);}}
}// 使用
var numbers = new List<int> { 1, 2, 3 };
var lazyNumbers = numbers.LazySelect(x => x * 10); // 不立即执行
foreach (var num in lazyNumbers) // 此时才执行
{Console.WriteLine(num); // 输出: 10, 20, 30
}
四、Lambda表达式的高级特性
1. 表达式树(Expression Trees)
using System.Linq.Expressions;Expression<Func<int, bool>> expr = x => x > 5;
Console.WriteLine(expr); // 输出: x => (x > 5)// 编译表达式
Func<int, bool>> compiled = expr.Compile();
Console.WriteLine(compiled(6)); // 输出: True
2. 捕获外部变量
int factor = 10;
Func<int, int> multiplier = x => x * factor;
Console.WriteLine(multiplier(5)); // 输出: 50
注意:捕获的变量会被提升到闭包中
3. 方法组转换
public class Calculator
{public int Add(int a, int b) => a + b;
}// 方法组转换为委托
Calculator calc = new Calculator();
Func<int, int, int> addDelegate = calc.Add;
Console.WriteLine(addDelegate(3, 4)); // 输出: 7
4. 匿名方法与Lambda对比
// 匿名方法
Func<int, int> square1 = delegate (int x) { return x * x; };// Lambda表达式
Func<int, int> square2 = x => x * x;
Lambda优势:
- 更简洁的语法
- 自动类型推断
- 支持表达式树
五、性能考虑
1. Lambda vs 方法
// 方法
private static int Add(int a, int b) => a + b;// 使用方法
Func<int, int, int> addMethod = Add;// 使用Lambda
Func<int, int, int> addLambda = (a, b) => a + b;
性能差异:
- 方法调用通常略快(无闭包开销)
- Lambda在简单情况下与方法性能相当
- 复杂Lambda可能有轻微性能开销
2. 闭包优化
// 不推荐 - 创建多个闭包
List<Func<int>> funcs = new List<Func<int>>();
for (int i = 0; i < 10; i++)
{funcs.Add(() => i); // 捕获循环变量i
}// 推荐 - 创建局部副本
for (int i = 0; i < 10; i++)
{int copy = i;funcs.Add(() => copy); // 捕获局部变量copy
}
六、调试与测试
1. Lambda调试技巧
// 添加调试信息
Func<int, int> debugLambda = x =>
{Console.WriteLine($"Input: {x}");return x * 2;
};
2. 单元测试Lambda
[Fact]
public void TestLambda()
{// ArrangeFunc<int, int> square = x => x * x;// Actvar result = square(5);// AssertAssert.Equal(25, result);
}
七、常见陷阱与解决方案
1. 变量捕获问题
问题:
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{funcs.Add(() => i); // 所有lambda都捕获同一个i
}
// 结果都是3
解决方案:
var funcs = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{int copy = i;funcs.Add(() => copy); // 每个lambda捕获自己的copy
}
// 结果0,1,2
2. 可变性陷阱
问题:
bool flag = false;
Action toggle = () => flag = !flag;
toggle();
Console.WriteLine(flag); // true
解决方案:
// 如果需要不可变行为,使用局部变量
void SetupToggle(out Action toggle)
{bool flag = false;toggle = () => flag = !flag; // 编译错误 - flag必须是final/readonly// 正确做法:使用闭包或重构设计
}
3. 性能陷阱
问题:
// 每次调用都创建新委托
Func<int, int> CreateMultiplier(int factor)
{return x => x * factor; // 每次调用都创建新闭包
}
解决方案:
// 缓存委托
private static readonly Dictionary<int, Func<int, int>> _multipliers = new Dictionary<int, Func<int, int>>();Func<int, int> CreateMultiplier(int factor)
{if (!_multipliers.TryGetValue(factor, out var multiplier)){multiplier = x => x * factor;_multipliers[factor] = multiplier;}return multiplier;
}
八、最佳实践
1. 命名规范
- 简单Lambda:
x => x * 2
- 复杂Lambda:使用大括号和return
x => {// 多行逻辑return x * 2; }
2. 可读性
- 保持Lambda简短(通常不超过2-3行)
- 复杂逻辑提取为命名方法
Func<int, int> complexCalc = x => CalculateSomething(x);private static int CalculateSomething(int x) {// 复杂逻辑return x * 2; }
3. 错误处理
Func<string, int> safeParse = s =>
{if (int.TryParse(s, out var result))return result;throw new ArgumentException("Invalid number format");
};
4. 延迟执行
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{foreach (var item in source){if (predicate(item))yield return item;}
}
九、扩展方法与Lambda结合的高级模式
1. 流式API设计
public static class QueryExtensions
{public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> predicate){return condition ? source.Where(predicate) : source;}public static IQueryable<T> OrderByProperty<T>(this IQueryable<T> source, string propertyName){var parameter = Expression.Parameter(typeof(T), "x");var property = Expression.Property(parameter, propertyName);var lambda = Expression.Lambda(property, parameter);var methodName = "OrderBy";var method = typeof(Queryable).GetMethods().First(m => m.Name == methodName && m.GetParameters().Length == 2).MakeGenericMethod(typeof(T), property.Type);return (IQueryable<T>)method.Invoke(null, new object[] { source, lambda });}
}// 使用
var query = dbContext.Products.WhereIf(showActiveOnly, p => p.IsActive).OrderByProperty("Price");
2. 函数组合
public static class FunctionCombinators
{public static Func<T, Z> Compose<T, Y, Z>(this Func<T, Y> f, Func<Y, Z> g){return x => g(f(x));}
}// 使用
Func<int, int> square = x => x * x;
Func<int, int> increment = x => x + 1;
Func<int, int> squareThenIncrement = increment.Compose(square);
Console.WriteLine(squareThenIncrement(3)); // (3 * 3)+1 = 10
3. 惰性求值
public static class LazyExtensions
{public static IEnumerable<T> LazySelect<T>(this IEnumerable<T> source, Func<T, T> selector){foreach (var item in source){yield return selector(item);}}
}// 使用
var numbers = new List<int> { 1, 2, 3 };
var lazyNumbers = numbers.LazySelect(x =>
{Console.WriteLine($"Processing {x}");return x * 10;
});// 此时不会执行
foreach (var num in lazyNumbers) // 执行时才处理
{Console.WriteLine(num);
}
十、实际应用示例
1. 数据库查询构建器
public class QueryBuilder<T>
{private readonly List<Expression<Func<T, bool>>> _predicates = new();public QueryBuilder<T> Where(Expression<Func<T, bool>> predicate){_predicates.Add(predicate);return this;}public IQueryable<T> Build(IQueryable<T> source){IQueryable<T> query = source;foreach (var predicate in _predicates){query = query.Where(predicate);}return query;}
}// 使用
var queryBuilder = new QueryBuilder<Product>().Where(p => p.Price > 100).Where(p => p.Category == "Electronics");var query = queryBuilder.Build(dbContext.Products);
2. 链式验证器
public static class ValidatorExtensions
{public static IValidator<T> Ensure<T>(this IValidator<T> validator, Func<T, bool> condition, string errorMessage){return new ConditionalValidator<T>(validator, condition, errorMessage);}
}public class ConditionalValidator<T> : IValidator<T>
{private readonly IValidator<T> _inner;private readonly Func<T, bool> _condition;private readonly string _errorMessage;public ConditionalValidator(IValidator<T> inner, Func<T, bool> condition, string errorMessage){_inner = inner;_condition = condition;_errorMessage = errorMessage;}public ValidationResult Validate(T instance){var result = _inner.Validate(instance);if (_condition(instance) && !result.IsValid){result.Errors.Add(new ValidationFailure("", _errorMessage));}return result;}
}// 使用
var validator = new BasicValidator<User>().Ensure(u => u.Age < 18, "未成年人不允许注册").Ensure(u => !string.IsNullOrEmpty(u.Email), "邮箱不能为空");
通过合理使用扩展方法和Lambda表达式,可以显著提高C#代码的表达力和简洁性,同时保持良好的可维护性和性能。在实际开发中,应根据具体场景选择最合适的模式和技术。
相关文章:
C#扩展方法与Lambda表达式基本用法
C# 扩展方法与 Lambda 表达式详解 一、扩展方法详解 1. 基本概念 扩展方法允许为现有类型"添加"方法,而无需修改原始类型或创建派生类型。 定义条件: 必须在静态类中定义方法本身必须是静态的第一个参数使用this修饰符指…...
C#规避内存泄漏的编码方法
C#规避内存泄漏的编码方法 内存泄漏是C#开发中常见的问题,尽管.NET有垃圾回收机制(GC),但不当的编码实践仍可能导致内存无法被及时回收。以下是系统性的规避内存泄漏的方法: 一、理解内存泄漏的常见原因 未释放的事件订阅静态…...
ARM 指令集(ubuntu环境学习) 第一章:ARM 指令集概述
1.1 ARM 架构简介 ARM(Advanced RISC Machine)是一种精简指令集计算机(RISC)架构,最初由英国的 ARM Holdings 公司设计。与复杂指令集计算机(CISC)不同,RISC 架构通过使用简单且高效的指令集,使得处理器能够以更高的速度和更低的功耗执行任务。ARM 架构被广泛应用于各…...
OpenCV实战教程:从零开始的计算机视觉之旅
第一部分:基础入门 OpenCV简介 什么是OpenCV及其应用领域开发环境搭建(Windows/MacOS/Linux)安装配置和第一个程序"Hello OpenCV" 图像基础 图像的数字表示方式色彩空间(RGB、HSV、灰度图)图像读取、显示与…...
零基础做自动驾驶集成测试(仿真)
图 1:使用 GPUDrive 进行极快的多代理模拟。上图:GPUDrive 中 Waymo Open Motion Dataset 场景的鸟瞰图,方框表示受控智能体,圆圈表示其目标。底部:相应的代理视图,以一个代理为中心。可以根据用户的目标轻…...
阿里云dns服务器不可用怎么办?dns可以随便改吗?
阿里云DNS服务器不可用怎么办?dns可以随便改吗? 当DNS服务器不可用时,可能导致无法访问网站或网络服务。以下是常见的解决方法: 1. 检查网络连接 确保设备已连接到互联网(如Wi-Fi或有线网络)。 尝试访问其他网站或服务&#x…...
神经网络用于地震数据时空均匀插值的方法与开源资料
神经网络用于地震数据时空均匀插值的方法与开源资料 地震数据的不均匀采样是一个常见问题,神经网络提供了一种有效的解决方案。以下是关于如何使用神经网络进行地震数据时空均匀插值的概述和可用资源。 主要方法 1. 基于深度学习的插值方法 卷积神经网络(CNN)&a…...
线性微分方程与非线性微分方程
方程一 d x d t x \frac{dx}{dt} x dtdxx 这是一个一阶线性常微分方程,可以直接分离变量求解。 将变量分离: d x x d t \frac{dx}{x} dt xdxdt 两边积分: ∫ 1 x d x ∫ 1 d t ⇒ ln ∣ x ∣ t C \int \frac{1}{x} \, dx \…...
Windows查看和修改IP,IP互相ping通
Windows系统 查看IP地址 winr 输入cmd 打开终端使用 ipconfig 或 ipconfig -all 命令查看当前网络 IPV4地址 Windows系统 修改IP地址 自动获取IP(DHCP): 打开 控制面板,点击 网络和Internet。点击 网络和共享中心。选择 更改适配…...
ESP32开发之freeRTOS的信号量
什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量 简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。 信号量能干啥 资源管理:控制多个任务对…...
CRMEB-PRO系统定时任务扩展开发指南
适用场景 当系统内置定时任务类型无法满足业务需求时,开发者可通过本教程快速掌握自定义定时任务的扩展方法。本指南以"定时检测服务"为例,演示完整开发流程。 我想添加一个定时任务 ,而这里没有我需要的,我怎么来添加 比如我想添加一个定时检…...
单片机不同通信方式的适用场景
一、串口通信 UART 通信双方约定好波特率,每次发送一个字节(8位数据) 这种通信方式一共有2根线,且互相独立不受影响。 串口通信的缺点 二、RS232和RS485 优点是能够远距离传输信号 RS232达到30m RS485达到1000m 同时RS485还具有一对多的功能 三、S…...
【神经网络与深度学习】探索全连接网络如何学习数据的复杂模式,提取高层次特征
引言 全连接网络(Fully Connected Network,FCN)是深度学习中的重要架构,广泛用于模式识别、分类和回归任务。其强大的特征提取能力使其能够自动学习输入数据中的复杂模式,并逐步形成高层次特征。这种能力主要依赖于参…...
股指期货贴水对对冲的影响大吗?
如果你持有股票,又担心股市下跌,可能会想到用股指期货来“对冲风险”——比如买入股票的同时,卖出股指期货合约。但如果股指期货处于贴水状态(期货价格低于现货价格),对冲效果会受影响吗? 一、…...
浙江大学 | DeepSeek系列公开课 | 当艺术遇见AI:科艺融合的前沿探索
今天要给大家分享一份由浙江大学出品的DeepSeek系列公开课第三季第一期,公开课的主题是当艺术遇见AI,科艺融合的新探索。本报告系统展示了浙江大学在艺术与人工智能融合领域的研究成果,涵盖古画修复流程、色彩复原技术、诗画融合模型、图像召…...
(Go Gin)Gin学习笔记(三)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
1. 数据解析和绑定 bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将请求体中的参数值绑定到对应的结构体上,以方便后续业务逻辑的处理 1.1 JSON数据解析和绑定 客户端传参,后端接收并解析到结构体 package mainim…...
【JavaEE】网络原理之初识(1.0)
目录 编辑 局域网与广域网 IP地址和端口号 实现简单的服务器客户端交互 简单理解socket TCP和UDP的差别(初识) socket面对udp DatagramSocket API DatagramSocket 构造方法 DatagramSocket 方法: DatagramPacket API Data…...
Go与Cpp的本质区别
这个问题是我们经常听到的问题 常见的观点有 Go 与 C 的差异主要体现在设计哲学、内存管理、并发模型、语法特性及应用场景等方面,以下从多个维度进行详细对比: 一、内存管理机制 C:需手动管理内存(如 new/delete、智能…...
Vulkan 学习(16)---- 使用 VertexBuffer
Vertex Buffer 创建一个 VertexBuffer 存储 Vertex data,代替之前在 Shader 中使用固定顶点值的做法 Vertex Shader 修改 GLSL 的 VertexShader 如下: 注意这里指定了 input Vertex data 的 location 和 格式 #version 450 layout(location 0) in vec2 inPosit…...
论文阅读 2024 arxiv Comprehensive Assessment of Jailbreak Attacks Against LLMs
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Comprehensive Assessment of Jailbreak Attacks Against LLMs https://arxiv.org/pdf/2402.05668 https://www.doubao.com/chat/4015423571416834 速览 这篇论文是关于大…...
SIFT特征点检测
刚看完了SIFT特征点检测的原理,阅读的是两篇csdn博客,一个全面和一个最全面,不得不说,你俩写的都很全面,这么用心奉献知识的博主是全人类的财富。 现在用我这张笨拙的嘴先说一下我理解的流程 首先先将图像扩大一倍&a…...
开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-pipeline方式(二)
一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...
Python os.path.join()路径拼接异常
问题 在使用os.path.join()对两个路径进行拼接,如:/University/School/和/Department/Class/进行拼接,最终的结果为/Department/Class/,而/University/School/却不知所踪。 import osos.path.join(“/University/School/”, “/…...
Flink之DataStream
Apache Flink 的 DataStream API 是用于 处理无限(流)或有限(批)数据流的核心编程模型,适用于事件驱动、实时分析、ETL 等场景。相比 Flink Table API,DataStream API 提供了更强的灵活性和底层控制能力。 …...
WHAT - Tailwind CSS + Antd = MetisUI组件库
文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们介绍了 Tailwind,至于 Antd 组件库,我们应该都耳熟能详,官网地址:htt…...
【LLM】MOE混合专家大模型综述(重要模块原理)
note 当前的 MoE 架构就是一个用显存换训练时长/推理延迟的架构MoE 目前的架构基本集中在于将原先 GPT 每层的 FFN 复制多份作为 n 个 expert,并增加一个 router,用来计算每个 token 对应到哪个 FFN(一般采用每个 token 固定指派 n 个 exper…...
量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索
引言:量子机器学习的新范式 在量子计算与经典机器学习交叉融合的前沿领域,量子机器学习(Quantum Machine Learning, QML)正经历着革命性突破。然而,随着量子比特规模的增长和算法复杂度的提升,传统计算架构…...
CentOS Linux 环境二进制方式安装 MySQL 5.7.32
文章目录 安装依赖包新建用户解压初始化配置文件启动服务登录MySQL修改密码停止数据库 安装依赖包 yum -y install libaio perl perl-devel libncurses* autoconf numactl新建用户 useradd mysql解压 tar xf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.32-l…...
数学:拉马努金如何想出计算圆周率的公式?
拉马努金(Srinivasa Ramanujan)提出的圆周率(π)计算公式,源于他对数学模式的超凡直觉、对无穷级数和模形式的深刻洞察,以及独特的非传统数学思维方式。尽管他的思考过程带有强烈的个人色彩,甚至…...
Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线
一、云原生架构:重构 Java 应用的运行范式 1.1 微服务架构的深度进化 Java 在微服务领域的实践正从 Spring Cloud 向服务网格(Service Mesh)演进。以 Istio 为代表的服务网格技术,通过 Sidecar 模式实现服务间通信的透明化管理&…...
mid360驱动安装以及联合相机标定
1 mid360 安装 1.1 安装 一定要使用 SDK2和 ROS2驱动(livox_ros_driver2) 先安装SDK2,再安装livox_ros_driver2 GitHub - Livox-SDK/Livox-SDK2: Drivers for receiving LiDAR data and controlling lidar, support Lidar HAP and Mid-360. GitHub - Livox-SDK/l…...
LeetCode —— 572. 另一棵树的子树
572. 另一棵树的子树 题目:给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…...
模型部署技巧(一)
模型部署技巧(一) 以下内容是参考CUDA与TensorRT模型部署内容第六章,主要针对图像的前/后处理中的trick。 参考: 1.部署分类器-int8-calibration 2. cudnn安装地址 3. 如何查找Tensor版本,与cuda 和 cudnn匹配 4. ti…...
PostgreSQL中的SSL
PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式等价于快照隔离,并非是真正的序列化模式。 这样的话就会存在一个问题,那就是写偏序(Write Skew)…...
使用 Spring Data Redis 实现 Redis 数据存储详解
使用 Spring Data Redis 实现 Redis 数据存储详解 Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块,它封装了 Redis 客户端的底层细节(如 Jedis 或 Lettuce),提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现…...
短视频矩阵系统贴牌开发实战:批量剪辑文件夹功能设计与实现
摘要:在短视频矩阵系统的开发中,批量处理功能是提升运营效率的关键。本文将深入探讨如何实现基于文件夹的短视频批量剪辑功能,涵盖技术选型、核心功能实现及代码示例。 一、需求背景与场景价值 在短视频矩阵运营场景中,运营者常面…...
2025年消防设施操作员考试题库及答案
一、判断题 25.防火门顺序器使用半个月后,需检查所有的螺钉,对固定螺钉进行加固拧紧,后续每月进行一次。() 答案:错误 解析:本题考查的是防火门顺序器的保养。防火门顺序器使用一周后&#x…...
ASP.NET MVC后端控制器用模型 接收前端ajax数据为空
1、前端js代码 如下: const formData {DeptName: D001,Phone: 12345678900 };$.ajax({url: "/Phone/SavePhone1",type: "POST",contentType: "application/json",data: JSON.stringify(formData), //必须要JSON.stringifysuccess:…...
ES基本使用方式
ES基本使用 文章目录 ES基本使用1.es的访问使用URL访问 2.mapping的理解Dynamic Mappingkeyword 与 text的区别基础定义与核心差异主字段,子字段 创建mapping 3.创建索引4.查看索引列表5.删除索引6.添加数据7.查询数据 重置es密码,初始用户elastic el…...
【中间件】bthread效率为什么高?
bthread效率为什么更高? 1 基本概念 bthread是brpc中的用户态线程,也是协程的一种实现。其采用M:N模型,即多个用户线程映射到少量的系统线程上。 2 高效做法 用户态调度:避免内核态和用户态之间的切换开销,上下文切…...
Transformer架构指南:从原理到实战资源全更新
🌟 什么是Transformer? 2017年Google提出的Transformer架构,彻底颠覆了传统RNN/LSTM的序列建模方式,通过自注意力机制实现全局上下文建模,成为GPT、BERT等大模型的底层基石。其核心优势在于并行化计算和长距离依赖捕捉…...
数据库规范
数据库版本相关 版本:mysql8.0 引擎:InnoDB 字符集:utf8mb4_general_ci 表名称 字段名称te 不允许使用大写字母,尽量使用英文或英文缩写,中间用下划线连接 数据表前缀为zzt_ 同一功能模块的表(特别是附表)尽量保持…...
Java 核心--泛型枚举
作者:IvanCodes 发布时间:2025年4月30日🤓 专栏:Java教程 各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList 里取出数据…...
使用skywalking进行go的接口监控和报警
安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …...
基于Docker的Elasticsearch ARM64架构镜像构建实践
一、前言 Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次…...
【Token系列】14|Prompt不是文本,是token结构工程
文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…...
在宝塔面板中安装OpenJDK-17的三种方法
title: 在宝塔面板中安装OpenJDK-17的三种方法 date: 2025-4-30 categories: 技术教程 tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少 OpenJDK-17(例如搭建 Minecraft 1.17 服务器时),本文提供三种解决方…...
瑞昱点屏芯片RTD2785T带旋转功能
一、产品概述 RTD2785T是瑞昱半导体(Realtek)推出的新一代高性能显示驱动芯片,专为高端显示器、嵌入式系统、工业控制及专业影像设备设计。该芯片集成多接口输入(HDMI、DP、DVI、VGA)与多种输出接口(eDP、…...
蓝桥杯Python(B)省赛回忆
Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…...
自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】
一、✨ 引言 随着三维重建技术的飞速发展,NeRF(Neural Radiance Fields)与 3D Gaussian Splatting(3DGS)等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…...