C# 告别FirstOrDefault
一、开篇:FirstOrDefault 的 “江湖地位”
在 C# 编程的世界里,FirstOrDefault 可谓是一位 “常客”,被广大开发者频繁地运用在各种项目场景之中。无论是 Windows 窗体应用程序,需要从数据集中检索第一条记录,或是满足特定条件的关键数据;还是ASP.NET Web 应用程序,在处理来自数据库的海量信息时,精准地抓取单个结果;亦或是控制台应用程序,面对数据流、文件数据时,快速定位首行内容;乃至 WPF 应用程序,处理数据绑定、UI 元素相关数据时,它都能派上用场,帮我们轻松获取集合中的第一个元素。甚至在类库项目里,开发者们还常常将它封装在公共方法内,以便在不同项目中重复利用,足见其通用性与灵活性。但今天,咱们得静下心来,好好探讨一下,为何在某些情况下,我们需要和这位 “老友” 暂别,去寻觅更好的替代方案。
二、深入剖析 FirstOrDefault
2.1 基本用法回顾
FirstOrDefault 是 C# 中 Linq 的一个扩展方法,它的定义为:public static TSource FirstOrDefault(this IEnumerable source);,这个方法接受一个类型为IEnumerable的参数source,返回源序列中的第一个元素或默认值。
咱们来看一段简单的代码示例:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int firstOrDefaultNumber = numbers.FirstOrDefault();
在上述代码中,numbers列表包含了多个整数元素,当我们调用FirstOrDefault方法时,它会按顺序遍历这个列表,由于列表不为空,便会返回第一个元素,也就是1。倘若我们将代码修改为:
List<int> emptyList = new List<int>();
int defaultNumber = emptyList.FirstOrDefault();
此时,emptyList为空列表,FirstOrDefault方法会直接返回int类型的默认值,也就是0。
再看一个字符串类型的例子:
List<string> names = new List<string> { "张三", "李四", "王五" };
string firstOrDefaultName = names.FirstOrDefault(s => s.StartsWith("王"));
这里,我们传入了一个 lambda 表达式作为条件,方法会在列表names中查找第一个以 “王” 开头的字符串,最终返回"王五"。若列表中不存在满足条件的元素,该方法就会返回string类型的默认值null。
2.2 原理拆解
从原理层面来讲,当我们调用FirstOrDefault方法时,它内部的执行逻辑是先检查序列是否为空。若为空,就直接返回对应类型的默认值;若不为空,则返回序列的第一个元素。
以一个简单的数组查找为例,假设我们有一个整数数组intArray:
int[] intArray = { 10, 20, 30, 40 };
int result = intArray.FirstOrDefault();
程序流程进入FirstOrDefault方法后,首先判断intArray是否为空,显然这里它不为空,于是直接返回第一个元素10。若将intArray定义为空数组:
int[] intArray = new int[0];
int result = intArray.FirstOrDefault();
此时,方法检测到数组为空,便返回int类型的默认值0。
三、那些年,FirstOrDefault 带来的 “坑”
3.1 返回值的模糊性
FirstOrDefault 最大的一个 “坑”,便是返回值的模糊性。当它返回默认值时,我们很难直观地判断究竟是因为没有找到符合条件的元素,还是真的找到了恰好与默认值相同的元素。
举个例子,假设我们有一个List类型的列表,用来存储学生的考试成绩,我们想要查找成绩为0分的学生:
List<int> scores = new List<int> { 0, 60, 80, 90 };
int result = scores.FirstOrDefault(s => s == 0);
这里,result的值为0,但我们无法仅凭这个返回值就确定是列表中的第一个学生恰好考了0分,还是根本没有考0分的学生,只是返回了int类型的默认值。这种模糊性在实际项目中,尤其是数据处理逻辑较为复杂时,极易引发错误,让开发者花费大量时间去排查问题根源。
3.2 引用与值类型的 “纠结”
对于引用类型和值类型,FirstOrDefault 的行为也存在一些令人 “纠结” 的地方。
当处理引用类型的元素时,比如List,其中Person是一个自定义的类:
class Person
{public string Name { get; set; }public int Age { get; set; }
}List<Person> people = new List<Person>
{new Person { Name = "张三", Age = 20 },new Person { Name = "李四", Age = 25 }
};
Person foundPerson = people.FirstOrDefault(p => p.Age > 22);
此时,foundPerson返回的是满足条件的Person对象的引用(如果找到的话)。但如果我们对这个返回的引用进行修改,就会直接影响到原列表中的元素,这可能会在不经意间破坏数据的一致性。
而对于值类型,例如List,当调用FirstOrDefault找到元素时,实际上返回的是元素值的一个副本。这意味着,对返回值进行操作,不会影响原列表中的元素,但同时也可能带来额外的性能开销,尤其是在处理大型结构体等复杂值类型时,频繁的复制操作会占用大量内存,降低程序效率。
3.3 隐藏的性能隐患
在一些看似简单的场景下,FirstOrDefault 还隐藏着性能隐患。
当我们面对复杂的数据结构,如多层嵌套的集合,或者大数据量的序列时,FirstOrDefault方法总是从序列的起始位置开始,逐个元素地进行条件判断,直至找到第一个满足条件的元素或者遍历完整个序列。
想象一下,我们有一个存储了海量用户数据的列表,要查找某个特定地区的第一个用户:
List<User> users = GetHugeUserList(); // 假设这是一个获取海量用户列表的方法
User targetUser = users.FirstOrDefault(u => u.Region == "特定地区");
在这个过程中,如果满足条件的用户位于列表末尾,或者根本不存在,那么FirstOrDefault方法就会进行大量不必要的迭代操作,白白浪费 CPU 资源,导致程序性能下降。特别是在对性能要求极高的实时系统、大数据处理场景中,这种性能损耗可能是致命的,使系统响应延迟,用户体验大打折扣。
四、替代方案 “群雄逐鹿”
4.1 SingleOrDefault 的 “特长”
SingleOrDefault 方法在特定场景下有着独特的优势。它的定义为:public static TSource SingleOrDefault(this IEnumerable source);,这个方法旨在返回序列中满足特定条件的唯一元素,如果序列为空或者包含多个满足条件的元素,它会返回默认值或者抛出异常。
与 FirstOrDefault 相比,当我们明确知道查询结果应该只有一个元素时,SingleOrDefault 能帮我们更严谨地处理这种情况。例如,在一个用户管理系统中,我们根据唯一的用户名去数据库查询对应的用户记录:
List<User> users = GetAllUsers(); // 假设这是获取所有用户的方法
User targetUser = users.SingleOrDefault(u => u.UserName == "特定用户名");
if (targetUser == null)
{Console.WriteLine("未找到该用户");
}
else
{// 对找到的用户进行操作
}
在上述代码中,如果没有找到匹配 “特定用户名” 的用户,SingleOrDefault会返回null;而如果找到了多个同名用户(这在用户名应唯一的场景下是异常情况),它会抛出InvalidOperationException异常,提示我们数据出现了问题,让开发者能及时发现并修复潜在的数据错误,相比 FirstOrDefault 返回值的模糊性,这无疑更加安全、可靠。
4.2 First 的 “果敢”
First 方法,其定义为:public static TSource First(this IEnumerable source);,它会直接返回序列的第一个元素,毫不拖泥带水。但要注意,如果序列为空,它会抛出InvalidOperationException异常。
在某些场景下,这种 “果敢” 反而能让代码更加清晰。比如,我们有一个固定的列表,用来存储系统的配置项,且我们确定这个列表不为空,此时只需获取头部的配置项:
List<ConfigItem> configList = GetSystemConfigs(); // 获取系统配置项列表
ConfigItem firstConfig = configList.First();
// 使用firstConfig进行后续操作
这里使用 First 方法,明确表达了我们对列表非空的预期,同时避免了 FirstOrDefault 可能带来的默认值混淆问题,让代码阅读者一眼就能明白开发者的意图,提升代码的可读性。
4.3 自定义扩展方法 “定制化出击”
除了上述内置方法,开发者还可以根据项目的独特需求,自定义扩展方法来替代 FirstOrDefault。
假设我们的项目经常需要在查找元素时记录详细的日志,以便排查问题,我们可以创建一个如下的扩展方法:
public static class MyLinqExtensions
{public static TSource FirstOrDefaultWithLog<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Action<string> logAction){TSource result = default;try{result = source.FirstOrDefault(predicate);if (result == null){logAction($"未找到满足条件 {predicate.Method.Name} 的元素");}}catch (Exception ex){logAction($"查找元素时出错: {ex.Message}");}return result;}
}
使用时,我们可以这样调用:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int result = numbers.FirstOrDefaultWithLog(n => n > 10, Console.WriteLine);
这样,当未找到满足条件的元素或者出现异常时,都会在控制台输出详细的日志信息,方便我们调试。
又或者,我们需要一个更加智能的默认值设定,根据不同情况返回不同的默认值,而非固定类型的默认值,代码示例如下:
public static class MyLinqExtensions
{public static TSource FirstOrDefaultCustom<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource> customDefaultValueProvider){TSource result = source.FirstOrDefault(predicate);if (result == null){result = customDefaultValueProvider();}return result;}
}
调用示例:
List<string> names = new List<string>();
string customDefault = "未找到合适名称";
string name = names.FirstOrDefaultCustom(s => s.StartsWith("X"), () => customDefault);
通过这种自定义扩展方法,我们可以精准地满足项目的个性化需求,让代码在面对复杂业务逻辑时更加游刃有余。
五、实战场景抉择:如何 “选贤任能”
5.1 数据库查询场景
在数据库查询场景中,FirstOrDefault 常常被用于获取单条记录。例如,我们使用 Entity Framework Core 从数据库中查询一个用户信息:
using (var context = new YourDbContext())
{User user = context.Users.FirstOrDefault(u => u.UserId == 1);if (user!= null){// 对查询到的用户进行操作}else{// 处理未找到用户的情况}
}
这里,如果数据库中存在UserId为1的用户,就能顺利获取到该用户信息;若不存在,返回null,避免了空引用异常。
但当我们对数据的唯一性有严格要求时,比如查询唯一的订单号对应的订单详情,此时 SingleOrDefault 更为合适:
using (var context = new YourDbContext())
{Order order = context.Orders.SingleOrDefault(o => o.OrderNumber == "20230808001");if (order == null){Console.WriteLine("未找到该订单");}else if (context.Orders.Count(o => o.OrderNumber == "20230808001") > 1){Console.WriteLine("订单号不唯一,数据有误");}else{// 处理查询到的唯一订单}
}
这段代码不仅能处理订单不存在的情况,当出现多个相同订单号时,还会抛出异常,提醒开发者数据出现了重复,保证了数据的一致性和准确性。
5.2 集合数据处理
在处理集合数据时,选择合适的方法至关重要。
假设我们有一个小型的固定集合,用来存储系统的初始配置参数:
List<ConfigParameter> configParameters = new List<ConfigParameter>
{new ConfigParameter { Name = "Param1", Value = "Value1" },new ConfigParameter { Name = "Param2", Value = "Value2" }
};
ConfigParameter firstParam = configParameters.First();
由于我们明确知道集合不为空且只需获取第一个参数,使用 First 方法简洁高效,还避免了 FirstOrDefault 返回默认值可能带来的混淆。
然而,当面对复杂多变的集合,比如一个电商系统中的商品列表,需要筛选出特定品牌且价格最低的商品:
List<Product> products = GetAllProducts(); // 假设这是获取所有商品的方法
Product targetProduct = null;
if (products.Any(p => p.Brand == "TargetBrand"))
{targetProduct = products.Where(p => p.Brand == "TargetBrand").OrderBy(p => p.Price).FirstOrDefault();
}
if (targetProduct!= null)
{// 对找到的商品进行推荐、展示等操作
}
else
{// 处理未找到合适商品的情况
}
这里先通过Any方法判断是否存在目标品牌的商品,若存在,再结合Where筛选、OrderBy排序后用 FirstOrDefault 获取符合条件的商品。若直接用 First,当不存在目标品牌商品时会抛出异常;若用 SingleOrDefault,在有多个相同最低价商品时会报错,均不符合业务需求。所以,要依据数据特性、业务逻辑,权衡三者的利弊,做出最优选择。
六、总结:编程路上的 “迭代升级”
FirstOrDefault 在 C# 编程的历史长河中,确实为我们提供了诸多便利,凭借其简洁的语法,让开发者能迅速从集合中抓取元素,节省了大量开发时间。然而,随着项目复杂度的攀升、对代码质量和性能要求的愈发严苛,它的一些弊端逐渐显现,如返回值的模糊性容易引入难以察觉的逻辑错误,在处理不同类型数据时的 “暗坑”,以及隐藏的性能瓶颈,都可能成为项目前进路上的 “绊脚石”。
庆幸的是,C# 丰富的语言特性为我们准备了诸如 SingleOrDefault、First 等替代方法,还有自定义扩展方法这一 “利器”,让我们能够依据项目的独特需求,量体裁衣,精准优化代码。在编程的漫漫征途中,没有一成不变的 “最优解”,唯有紧跟技术发展步伐,不断反思、持续优化,才能让我们的代码在不同场景下都能高效运行。希望各位开发者在日后的编程实践中,能深入理解这些方法的精妙之处,灵活抉择,让代码世界更加 “精彩”。
相关文章:
C# 告别FirstOrDefault
一、开篇:FirstOrDefault 的 “江湖地位” 在 C# 编程的世界里,FirstOrDefault 可谓是一位 “常客”,被广大开发者频繁地运用在各种项目场景之中。无论是 Windows 窗体应用程序,需要从数据集中检索第一条记录,或是满足…...
图像处理|腐蚀操作
在计算机视觉与图像处理中,腐蚀操作(Erosion)是形态学操作的一种。形态学操作广泛应用于二值图像中,主要用于分析和提取图像中的结构信息。腐蚀操作是这类操作中最常见的一种,用来对图像进行“收缩”处理,消…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(应用)
实战训练1—报数游戏 问题描述: 小明和小鹏玩报数游戏,小明按1∼20 报数,小鹏按1∼30报数。若两人同时开始,并以同样的速度报数,当两人都报了1000个数时,同时报相同数的次数是多少呢? 输入格…...
140.WEB渗透测试-信息收集-小程序、app(11)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:139.WEB渗透测试-信息收集-小程序、app(10) 3.直接有app 直接拿…...
《新闻大厦抢先版》V0.18.105+Dlcs官方学习版
《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼,保障员工权益并及时赶上周日的印刷交期! 招募并管理不同职业以登上成功的阶梯:记者、摄像师、勤杂工,除此以外…...
【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象
一、prop校验 如果我们在想要限制prop的类型,就可以在接收prop的时候对接收类型进行限制: defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制,只会在后台进行提示: 二、…...
Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
Spring Boot | 基于MinIO实现文件上传和下载
关注:CodingTechWork 介绍 在现代的 web 应用中,文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务,可以用来存储和管理大量的非结构化数据,如图片、视频、日志文件等。本文将介绍如何在 Spring Boot 应用…...
【DNS 阿里云,域名解析,解析到IP的指定端口】
- 进入 阿里云域名解析界面 - 点击 解析设置 - 添加记录 1.添加一条 A/AAAA 类型解析你的服务器的IP地址(不需要带端口号,这条解析只是起到中转作用) 示例:主机记录:aa.bb.com 记录值:xxx.xxx.xxx.xxx (…...
力扣经典二分题:4. 寻找两个正序数组的中位数
题目链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode) 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是:int m nums1.size(),n nums2.size();中位数性质1:中位数左侧元素 …...
Java Web开发进阶——Spring Boot与Spring Data JPA
Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时,开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…...
PySpark用sort-merge join解决数据倾斜的完整案例
假设有两个大表 table1 和 table2 ,并通过 sort-merge join 来解决可能的数据倾斜问题。 from pyspark.sql import SparkSession from pyspark.sql.functions import col# 初始化SparkSession spark SparkSession.builder.appName("SortMergeJoinExample&quo…...
【2025 Rust学习 --- 11 实用工具特型01】
清理特型Drop 当一个值的拥有者消失时,Rust 会丢弃(drop)该值。丢弃一个值就必须释放 该值拥有的任何其他值、堆存储和系统资源。 丢弃可能发生在多种情况下: 当变量超出作用域时;在表达式语句的末尾;当…...
关于Linux PAM模块下的pam_listfile
讲《Linux下禁止root远程登录访问》故事的时候,说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。 下面这些就好比人物的简介,甚是恼人;让人看得不明就里,反正“他大舅他二舅都是他舅”。可以直接跳…...
根据中文名称首字母进行分组
很多项目中,需要用到中文名称到首字母进行分组,例如:城市、游戏等等。。。 /*** 将集合数据按照汉字首字母分组排序** param list* return*/public Map<String, Object> screenManufacturer(List<Game> list) {Set<String>…...
springboot 集成 etcd
springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们,上两期内容中,我们对于分布式kv存储中间件有了简单的认识,完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper,既然有了认识&a…...
人工智能-数据分析及特征提取思路
1、概况 基于学生行为数据预测是否涉黄、涉黑等。 2.数据分析 数据分析的意义包括得到数据得直觉、发掘潜在的结构、提取重要的变量、删除异常值、检验潜在的假设和建立初步的模型。 2.1数据质量分析 2.1.1数据值分析 查看数据类型: 首先明确各字段的数据类型…...
设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类,通过状态对象的行为改变来避免…...
Android 系统签名 keytool-importkeypair
要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包,可以按照以下步骤操作: 步骤 1:准备系统签名文件 从 Android 系统源码中获取系统签名文件,通常位于 build/target/product/security 目录下,包括 pla…...
ubuntu22.04 gcc,g++从10.5切换到低版本9.5
一、安装gcc-9.5 mkdir gcc cd gcc sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends gcc-9 | grep -v i386 | grep "^\w") sudo dpkg -i *.deb sudo…...
Microsoft 已经弃用了 <experimental/filesystem> 头文件
#define _CRT_SECURE_NO_WARNINGS 1 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1 //Microsoft 已经弃用了 <experimental / filesystem> 头文件,并计划在将来移除它。取而代之的是 C17 标准引入的 //<filesystem> 头文件…...
git 提交命令记录
1.已有本地和远程仓库 查看仓库远程地址: git remote -v 大量提交 git add . git commit -m "提交说明" git push 之后输入用户名密码 删除文件 git rm 文件名 替代git add 后面一样 2.全新提交 新建远程仓库 git init touch README.md git add . …...
Unity + Firebase + GoogleSignIn 导入问题
我目前使用 Unity版本:2021.3.33f1 JDK版本为:1.8 Gradle 版本为:6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为: 1.0.1 问题1 :手机点击登录报错 apk转化成zip,解压,看到/lib/armeabi-v…...
深度学习的加速器:Horovod,让分布式训练更简单高效!
什么是 Horovod? Horovod 是 Uber 开发的一个专注于深度学习分布式训练的开源框架,旨在简化和加速多 GPU、多节点环境下的训练过程。它以轻量级、易用、高性能著称,特别适合需要快速部署分布式训练的场景。Horovod 的名字来源于俄罗斯传统舞…...
AI刷题-异或编码、拼凑单词 chi
目录 一、异或编码 问题描述 测试样例 解题思路: 问题理解 解题思路 数据结构选择 算法步骤 最终代码: 运行结果: 二、拼凑单词 chi 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码&a…...
xml简介
目录 基本语法特点及应用场景一个简单示例 xml(全称eXtensible Markup Language)是一种用于存储和传输数据的标记语言,跨平台并且跨语言,xml内容较多,这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…...
MYSQL------MySQL 复制MySQL Cluster 架构
MySQL 复制 安装配置 主服务器配置 首先,在主服务器的配置文件(my.cnf 或 my.ini)中添加以下基本配置: [mysqld] server-id 1 log-bin /var/log/mysql/mysql-bin.logserver-id:为服务器分配唯一的标识࿰…...
【人工智能】 用Python构建图像分类模型:从TensorFlow到PyTorch的全面指南
随着深度学习在计算机视觉领域的迅猛发展,图像分类作为其核心任务之一,受到了广泛的关注。本文旨在详细介绍如何使用Python构建图像分类模型,从TensorFlow到PyTorch两个主流深度学习框架进行全面对比与实践。文章首先回顾了图像分类的基本概念…...
计算机网络 笔记 数据链路层 2
1,信道划分: (1)时分复用TDM 将时间等分为“TDM帧”,每个TDM帧内部等分为m个时隙,m个用户对应m个时隙 缺点:每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据,那么就会在这个时间信道被闲置,利用…...
2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)
2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看...
Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱
一、Apache Hop是什么? 1、Apache Hop,简称Hop,全称为Hop Orchestration Platform,即Hop 工作编排平台,是一个数据编排和数据工程平台,旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…...
Unity 人体切片三维可视化,可任意裁切切割。查看不同断层的图像。
Unity 人体切片三维可视化,真彩色,可任意裁切切割。查看不同断层的图像。 点击查看效果: 视频效果...
ModuleNotFoundError: No module named ‘podm.metrics‘报错等解决方法
ModuleNotFoundError: No module named podm.metrics’报错等解决方法 podm.metrics 在运行时报错: ModuleNotFoundError: No module named ‘podm.metrics’ 安装了podm后还是报错 解决方法: 查看安装位置 查看podm的安装位置,并打开到该…...
Java虚拟机运行时数据区域(内存模型)
程序计数器(线程私有内存) What:程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 程序控制流的指示器, 分支,循环,跳转,异常处理,线程…...
trf 4.10安装与使用-生信工具42
01 背景 DNA 中的串联重复(Tandem Repeat)指的是两个或多个相邻且近似的核苷酸模式的拷贝。Tandem Repeats Finder (TRF) 是一个程序,用于定位并显示 DNA 序列中的串联重复。用户只需提交一个以 FASTA 格式编写的序列,无需指定重…...
rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等
小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计,配备6.9英寸全面屏.八核处理器骁龙636,后置双摄像头1200万500万像素,前置800万像素.机型代码 :nitrogen.官方最终版为稳定版12.5…...
PySide6-UI界面设计
导论: PySide6和PyQt都是Python对Qt框架的绑定,允许开发者使用Qt创建平台的GUI应用程序。如果你正在开发商业项目,或者需要使用最新的QT6特性,PySide6是一个更好的选择。如果你更倾向于一个成熟的社区和丰富的资源,Py…...
Java创建线程的方式有哪些?
创建线程的方式 1. 继承 Thread 类 在 Java 中,当你启动一个线程时,实际上是调用了 Thread 类的 start() 方法。这个方法会执行以下几个步骤: 线程的状态转变:调用 start() 方法后,线程的状态从 NEW 转变为 RUNNABL…...
Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.
解决 sudo apt install apt-file sudo apt-file updatesudo apt-file search xmllint sudo apt install libxml2-utils执行 # postgres源码安装包解压文件夹中 make install make install问题 make -C src install make[2]: Entering directory /home/postgres/postgresql-1…...
Jenkins pipeline 发送邮件及包含附件
Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN (保存TOKEN, 后面Jenkins会用到) Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...
基于深度学习的视觉检测小项目(十) 通过样式表改变界面的外观
一、创建色卡模板文件 在PS中打开之前创建的色卡文件,用吸管拾色器吸取各个色卡的色彩值: 并保存为JSON文件,color_card.json,文件保存在项目的/settings目录下: {"colors": {"RED": "#dc1…...
【Java基础】Stream流、文件File相关操作,IO的含义与运用
1. Java 流(Stream)、文件(File)和IO Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。 输入流表…...
Java-日志-Slf4j-Log4j-logback
文章目录 SLF4J基础概念使用输出形式日志绑定桥接旧的框架实战 logback基础概念配置文件 Log4j概述 SLF4J 参考: https://www.cnblogs.com/shenStudy/p/15806951.html https://slf4j.org/ 基础概念 是什么?SLF4J(Simple Logging Facade fo…...
探索式测试
探索式测试是一种软件测试风格,它强调独立测试人员的个人自由和职责,为了持续优化其工作的价值,将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动,在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…...
LeetCode LCP17速算机器人
速算机器人:探索字符指令下的数字变换 在编程的奇妙世界里,我们常常会遇到各种有趣的算法问题,这些问题不仅考验我们的逻辑思维,还能让我们感受到编程解决实际问题的魅力。今天,就让我们一同探讨一个关于速算机器人的…...
Taro+Vue实现图片裁剪组件
cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件,支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境,可以在网页、小程序等平台中使用。 源码 https:…...
ISP各模块功能介绍
--------声明,本文为转载整理------- ISP各个模块功能介绍: 各模块前后效果对比: 黑电平补偿(BLC) 在理想情况下,没有光照射的像素点其响应值应为0。但是,由于杂质、受热等其它原因的影响&…...
SQL-leetcode-584. 寻找用户推荐人
584. 寻找用户推荐人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中,id 是该表的主键列。 该表的每一行表示一个客户的 id、姓名以及推…...
新冠肺炎服务预约微信小程序的设计与实现ssm+论文源码调试讲解
第4章 系统设计 4.1 系统设计的原则 在系统设计过程中,也需要遵循相应的设计原则,这些设计原则可以帮助设计者在短时间内设计出符合设计规范的设计方案。设计原则主要有可靠性,安全性,可定制化,可扩展性,可…...
多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现
多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现 引言 想象一下,顾客在购物时只需上传一张他们所期望的服装或产品的照片,几分钟内便能收到来自他们最喜欢的商店的个性化推荐。这就是多模态人工智能在零售领域所带…...