zoukankan      html  css  js  c++  java
  • 浅谈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

    扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送

    本文版权归作者所有,转载请保留此声明和原文链接

  • 相关阅读:
    CSS
    人物
    CSS
    CSS
    概念- 工业4.0
    C#正则表达式
    六月定律
    c#中实现登陆窗口(无需隐藏)
    c#中关于String、string,Object、object,Int32、int
    一个快速找第k+1小的算法
  • 原文地址:https://www.cnblogs.com/tiger-wang/p/14512497.html
Copyright © 2011-2022 走看看