1. 程式人生 > >淺談Dotnet的資料定位和匹配

淺談Dotnet的資料定位和匹配

> Dotnet裡,資料定位和匹配的相關程式設計現在變得很舒服。   最近專案緊,還要不停出差。 所以,寫個短點的、最近經常用到的內容:資料定位和匹配。   ## 資料定位 假設我們有這樣一個數組: ```c# var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; ``` 我們取某個位置的值,以前的做法通常是: ```c# int x = array[4]; int y = array[array.Length - 1]; ``` 現在,我們有了一個專門用於定位的結構`System.Index`。注意,這是一個結構。 所以,取特定位置的資料,可以寫成這樣: ```c# Index index = new Index(4, fromEnd: false); int x = array[index]; ``` 或者直接合併成: ```c# int x = array[new Index(4, false)]; ```   看一下`Index`的第二個引數`fromEnd`,很明顯,就是這個計數是從前往後還是從後往前計數的一個標誌。所以,從尾計數,可以寫成: ```c# int y = array[new Index(1, true)]; ``` 這兒要稍注意一下,從後往前計數,索引值1是最後一個數據,索引值0指出去了,會報錯。我們可以把這個數字想象成`array.length-x` 裡的`x`。 另外,在`fromEnd`值為`true`時,即從後往前計數時,`Index`提供了一個簡單的寫法: ```c# Index index = ^1; ```   額外的知識點:這個`Index`可以用在很多需要定位的地方。看個例子: ```c# string s = @"Hello WangPlus"; char a = s[new Index(4)]; char b = s[^2]; ```   *    為了防止不提供原網址的轉載,特在這裡加上原文連結:* # 資料範圍 有定位,就會有範圍。 還是上面的例子: ```c# var array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; ``` 通常,我們取一個範圍的資料,會這麼取: ```c# var x = array.Skip(3).Take(2); ``` 或者用個迴圈,我就不寫了。   這兒,又有一個神奇的結構:`System.Range`。 ```c# 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`。所以,程式碼可以簡化為: ```c# Range r = 3..5; var xx = array[r]; ``` 省去定義,就變成: ```c# var xx = array[3..5]; ``` 這個寫法還可以延伸出: ```c# var xx = array[3..]; //從第3個數據到最後 var xx = array[..5]; //從頭到第4個數據(注意後面是不包含) var xx = array[..]; //全部 var xx = array[0..^0]; //全部 ```   同`Index`一樣,這個`Range`也可以用在各種需要範圍的地方,例如: ```c# string s = @"Hello WangPlus"; string a = s[3..5]; ``` ## 資料匹配 還是拿例子來說。假設我們有下面的一個類定義: ```c# class Employee { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } ``` 使用中,我們生成了一個例項: ```c# var employee = new Employee() { Id = 1, Name = "John Doe", Age = 0 }; ``` 然後,我們邏輯中需要一些條件判斷,通常,我們可能這麼寫: ```c@ if(employee.Age == 0) {} if(employee.Name != null) {} ```   現在,我們有了更具有可讀性的寫法。 **簡單比較** ```c# if(employee.Age is 0) {} if(employee.Name is null) {} if(employee.Name is not null) {} ``` **型別檢查並建立例項** ```c# if(employee is Employee emp) { emp.Age = 5; } ``` **屬性比較** ```c# if (employee is { Age: 3 }) {} if (employee is { Age: 30, Name: "aaa" }) {} if (employee is { Age: > 25 }) {} ``` 自己感覺,屬性比較是寫著最痛快的,終於不用一長串的`&&`了。   這就是今天的內容了。有沒有Get到爽點?

微信公眾號:老王Plus

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

本文版權歸作者所有,轉載請保留此宣告和原文連結