Dotnet的數(shù)據(jù)定位和匹配
本文轉(zhuǎn)載自微信公眾號(hào)「老王Plus」,作者老王Plus的老王 。轉(zhuǎn)載本文請(qǐng)聯(lián)系老王Plus公眾號(hào)。
最近項(xiàng)目緊,還要不停出差。
所以,寫個(gè)短點(diǎn)的、最近經(jīng)常用到的內(nèi)容:數(shù)據(jù)定位和匹配。
數(shù)據(jù)定位
假設(shè)我們有這樣一個(gè)數(shù)組:
- var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
我們?nèi)∧硞€(gè)位置的值,以前的做法通常是:
- int x = array[4];
- int y = array[array.Length - 1];
現(xiàn)在,我們有了一個(gè)專門用于定位的結(jié)構(gòu)System.Index。注意,這是一個(gè)結(jié)構(gòu)。
所以,取特定位置的數(shù)據(jù),可以寫成這樣:
- Index index = new Index(4, fromEnd: false);
- int x = array[index];
或者直接合并成:
- int x = array[new Index(4, false)];
看一下Index的第二個(gè)參數(shù)fromEnd,很明顯,就是這個(gè)計(jì)數(shù)是從前往后還是從后往前計(jì)數(shù)的一個(gè)標(biāo)志。所以,從尾計(jì)數(shù),可以寫成:
- int y = array[new Index(1, true)];
這兒要稍注意一下,從后往前計(jì)數(shù),索引值1是最后一個(gè)數(shù)據(jù),索引值0指出去了,會(huì)報(bào)錯(cuò)。我們可以把這個(gè)數(shù)字想象成array.length-x
里的x。
另外,在fromEnd值為true時(shí),即從后往前計(jì)數(shù)時(shí),Index提供了一個(gè)簡(jiǎn)單的寫法:
- Index index = ^1;
額外的知識(shí)點(diǎn):這個(gè)Index可以用在很多需要定位的地方。看個(gè)例子:
- string s = @"Hello WangPlus";
- char a = s[new Index(4)];
- char b = s[^2];
為了防止不提供原網(wǎng)址的轉(zhuǎn)載,特在這里加上原文鏈接:https://abc.com
數(shù)據(jù)范圍
有定位,就會(huì)有范圍。
還是上面的例子:
- var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
通常,我們?nèi)∫粋€(gè)范圍的數(shù)據(jù),會(huì)這么?。?/p>
- var x = array.Skip(3).Take(2);
或者用個(gè)循環(huán),我就不寫了。
這兒,又有一個(gè)神奇的結(jié)構(gòu):System.Range。
- Range r = new Range(3, 5);
- var xx = array[r];
結(jié)果跟上面array.Skip(3).Take(2)是一樣的。
這里,Range(Index start, Index end)里,兩個(gè)參數(shù)就是上一節(jié)的Index。另外,開始索引是包含的,結(jié)束索引是不包含的。這兒需要注意一下。
這里又有一個(gè)簡(jiǎn)單的寫法。Range(3,5)可以簡(jiǎn)單寫為3..5。所以,代碼可以簡(jiǎn)化為:
- Range r = 3..5;
- var xx = array[r];
省去定義,就變成:
- var xx = array[3..5];
這個(gè)寫法還可以延伸出:
- var xx = array[3..]; //從第3個(gè)數(shù)據(jù)到最后
- var xx = array[..5]; //從頭到第4個(gè)數(shù)據(jù)(注意后面是不包含)
- var xx = array[..]; //全部
- var xx = array[0..^0]; //全部
同Index一樣,這個(gè)Range也可以用在各種需要范圍的地方,例如:
- string s = @"Hello WangPlus";
- string a = s[3..5];
數(shù)據(jù)匹配
還是拿例子來說。假設(shè)我們有下面的一個(gè)類定義:
- class Employee
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public int Age { get; set; }
- }
使用中,我們生成了一個(gè)實(shí)例:
- var employee = new Employee() { Id = 1, Name = "John Doe", Age = 0 };
然后,我們邏輯中需要一些條件判斷,通常,我們可能這么寫:
- if(employee.Age == 0) {}
- if(employee.Name != null) {}
現(xiàn)在,我們有了更具有可讀性的寫法。
簡(jiǎn)單比較
- if(employee.Age is 0) {}
- if(employee.Name is null) {}
- if(employee.Name is not null) {}
類型檢查并創(chuàng)建實(shí)例
- 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 }) {}
自己感覺,屬性比較是寫著最痛快的,終于不用一長(zhǎng)串的&&了。
這就是今天的內(nèi)容了。有沒有Get到爽點(diǎn)?