淺談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

掃描二維碼,關注個人公衆號,可以第一時間得到最新的個人文章和內容推送

本文版權歸作者所有,轉載請保留此聲明和原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章