浅谈Dotnet的数据定位和匹配
Dotnet里,数据定位和匹配的相关编程现在变得很舒服。
最近项目紧,还要不停出差。
所以,写个短点的、最近经常用到的内容:数据定位和匹配。
数据定位
假设我们有这样一个数组:
var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
我们取某个位置的值,以前的做法通常是:
int x = array[4];
int y = array[array.Length - 1];
现在,我们有了一个专门用于定位的结构System.Index
。注意,这是一个结构。
所以,取特定位置的数据,可以写成这样:
Index index = new Index(4, fromEnd: false);
int x = array[index];
或者直接合并成:
int x = array[new Index(4, false)];
看一下Index
的第二个参数fromEnd
,很明显,就是这个计数是从前往后还是从后往前计数的一个标志。所以,从尾计数,可以写成:
int y = array[new Index(1, true)];
这儿要稍注意一下,从后往前计数,索引值1是最后一个数据,索引值0指出去了,会报错。我们可以把这个数字想象成array.length-x
里的x
。
另外,在fromEnd
值为true
时,即从后往前计数时,Index
提供了一个简单的写法:
Index index = ^1;
额外的知识点:这个Index
可以用在很多需要定位的地方。看个例子:
string s = @"Hello WangPlus";
char a = s[new Index(4)];
char b = s[^2];
为了防止不提供原网址的转载,特在这里加上原文链接:https://www.cnblogs.com/tiger-wang/p/14512497.html
数据范围
有定位,就会有范围。
还是上面的例子:
var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
通常,我们取一个范围的数据,会这么取:
var x = array.Skip(3).Take(2);
或者用个循环,我就不写了。
这儿,又有一个神奇的结构:System.Range
。
Range r = new Range(3, 5);
var xx = array[r];
结果跟上面array.Skip(3).Take(2)
是一样的。
这里,Range(Index start, Index end)
里,两个参数就是上一节的Index
。另外,开始索引是包含的,结束索引是不包含的。这儿需要注意一下。
这里又有一个简单的写法。Range(3,5)
可以简单写为3..5
。所以,代码可以简化为:
Range r = 3..5;
var xx = array[r];
省去定义,就变成:
var xx = array[3..5];
这个写法还可以延伸出:
var xx = array[3..]; //从第3个数据到最后
var xx = array[..5]; //从头到第4个数据(注意后面是不包含)
var xx = array[..]; //全部
var xx = array[0..^0]; //全部
同Index
一样,这个Range
也可以用在各种需要范围的地方,例如:
string s = @"Hello WangPlus";
string a = s[3..5];
数据匹配
还是拿例子来说。假设我们有下面的一个类定义:
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
使用中,我们生成了一个实例:
var employee = new Employee() { Id = 1, Name = "John Doe", Age = 0 };
然后,我们逻辑中需要一些条件判断,通常,我们可能这么写:
if(employee.Age == 0) {}
if(employee.Name != null) {}
现在,我们有了更具有可读性的写法。
简单比较
if(employee.Age is 0) {}
if(employee.Name is null) {}
if(employee.Name is not null) {}
类型检查并创建实例
if(employee is Employee emp)
{
emp.Age = 5;
}
属性比较
if (employee is { Age: 3 }) {}
if (employee is { Age: 30, Name: "aaa" }) {}
if (employee is { Age: > 25 }) {}
自己感觉,属性比较是写着最痛快的,终于不用一长串的&&
了。
这就是今天的内容了。有没有Get到爽点?
![]() |
微信公众号:老王Plus 扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送 本文版权归作者所有,转载请保留此声明和原文链接 |
浅谈Dotnet的数据定位和匹配的更多相关文章
- 浅谈SQL Server数据内部表现形式
在上篇文章 浅谈SQL Server内部运行机制 中,与大家分享了SQL Server内部运行机制,通过上次的分享,相信大家已经能解决如下几个问题: 1.SQL Server 体系结构由哪几部分组成? ...
- 浅谈 sql 中数据的约束
数据约束 --对用户操作表的数据进行约束 1.默认值 --当用户对使用默认值的字段不插入值的时候,就使用默认值 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null [例如:ad ...
- 浅谈WebService返回数据效率对比
原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html 一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问 ...
- 浅谈Android View的定位
引言 今天我们来介绍Android坐标系统和View的定位,当然也会介绍View的滑动相关话题.下面让我们开始介绍吧. View的基础知识 View是Android中所有控件的基类,无论是TextVi ...
- 浅谈CSS中的定位知识
1,静态定位(static) 表示按照正常定位方案,元素盒按照在文档流中出现的顺序依次格式化: 2,相对定位(relative) 将移动元素盒,但是它在文档流中的原始空间会保留下来: 相对定位元素有如 ...
- 浅谈Python小数据池
什么是小数据池 小数据池是python中提高效率的一种方式,固定数据类型的相同值使用同一内存地址. id 用于获取开辟空间的内存地址 代码块 一个文件,一个模块,一个函数,一个类,终端中的每一行代码都 ...
- Python Web 基础向(四) 浅谈数据层
数据层一般会给人带来一些困扰,在于其定位不准确.聚合Model的工作也可以放在逻辑层做,但会导致逻辑层变重,经常出现大段晦涩代码.因此我的建议是保留Model聚合层,尽管会导致工作量的略微增加,但却可 ...
- 浅谈程序员创业(要有一个自己的网站,最好的方式还是自己定位一个产品,用心把这个产品做好。或者满足不同需求的用户,要有特色)good
浅谈程序员创业 ——作者:邓学彬.Jiesoft 1.什么是创业? 关于“创业”二字有必要重新学习一下,找了两个相对权威定义: 创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而 ...
- 浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
随机推荐
- EFCore学习记录--数据访问技术人门
1.安装Microsoft.EntityFrameworkCore.Sqlite.Microsoft.EntityFrameworkCore.Tools包2.创建模型 数据库上下文模型:Bloggin ...
- OpenStack Train版-3.安装glance镜像服务
安装glance镜像服务 创建数据库并授权 mysql -u root create database glance; GRANT ALL PRIVILEGES ON glance.* TO 'gla ...
- Linux命令学习-01——find -type
Linux find 命令用来在指定目录下查找文件. 任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件.并且将查找到 ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
- Linux 驱动框架---驱动中的并发
并发指多个执行单元被同时.并行的执行,而并发执行的单元对共享资源的访问就容易导致竟态.并发产生的情况分为抢占和并行(多核)和硬抢占(中断).Linux为解决这一问题增加了一系列的接口来解决并发导致的竟 ...
- JVM系列(三):JVM创建过程解析
上两篇中梳理了整个java启动过程中,jvm大致是如何运行的.即厘清了我们认为的jvm的启动过程.但那里面仅为一些大致的东西,比如参数解析,验证,dll加载等等.把最核心的loadJavaVM()交给 ...
- Chrome Enhanced Protection
Chrome Enhanced Protection chrome://settings/security?q=enhanced 站内外链跳转拦截 refs xgqfrms 2012-2020 www ...
- EventBus / Event Bus
EventBus / Event Bus EventEmitter / Event Emitter https://greenrobot.org/eventbus/documentation/ htt ...
- js 截取固定长度字符串但不打断单词
适用地方:英文网站中,比如面包屑导航处新闻标题过长.用css截取文本简介时将单词打断 // 使用方法 // 1.复制下面函数 // 2.调用 // 3.填参数 sliceString(targe ...
- NGK钱包真的安全吗?
对于数字资产持有者而言,资产的安全永远是首要的,因而数字钱包的安全性显得尤为重要.数字钱包分为冷钱包和热钱包两种.热钱包叫做在线钱包,而冷钱包被称为离线钱包,也叫硬件钱包.数字钱包一旦被盗,被追回的概 ...