- Span
C# 7 里面出現(xiàn)了Span這個(gè)數(shù)據(jù)類型,它可以表示另一個(gè)數(shù)據(jù)結(jié)構(gòu)里連續(xù)相鄰的一串?dāng)?shù)據(jù),并且它是內(nèi)存安全的
static void TestSpan()
{
//var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var arr = Enumerable.Range(1, 10).ToArray();
Span<int> slice = arr.AsSpan().Slice(2, 4);
Console.WriteLine(string.Join(",", slice.ToArray()));
}
//返回3,4,5,6
```c#
- Range
而C# 8里面我們可以從一個(gè)序列里面很簡(jiǎn)單的提取出來(lái)一個(gè)子范圍組成新的序列。
```c#
int[] someArray = Enumerable.Range(1, 5).ToArray();
int[] subArray1 = someArray[0..2];//{1,2}
Console.WriteLine(string.Join(",", subArray1));
//返回1,2
這里面使用了范圍運(yùn)算符..。
arr[2..4]表示把a(bǔ)rr這個(gè)序列,從索引為2的元素一直到索引為4(但不包括索引4)的元素提取出來(lái)組成新的序列。所以結(jié)果就是3,4
更多Range例子:
//int[] someArray = new int[5] { 1, 2, 3, 4, 5 };
int[] someArray = Enumerable.Range(1, 5).ToArray();
int[] subArray1 = someArray[0..2];//{1,2}
Console.WriteLine(string.Join(",", subArray1));
int[] subArray2 = someArray[1..^0];//{2,3,4,5}
Console.WriteLine(string.Join(",", subArray2));
int[] subArray3 = someArray[1..];
Console.WriteLine(string.Join(",", subArray3));
List<int> otherArray = new List<int> { 1, 2, 3, 4, 5 };
int[] other1 = otherArray.ToArray()[1..2];
//創(chuàng)建Range對(duì)象
//var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var arr = Enumerable.Range(1, 10).ToArray();
Index middle = 4;
Index threeFromEnd = ^3;//Hat運(yùn)算符^
Range range = middle..threeFromEnd;
int[] slice = arr[range];
Console.WriteLine(string.Join(",", slice));
//使用Index類型和^操作符
Index index = ^2;
var number = arr[index];
Console.WriteLine(number);//9
//使用Range和Index
var arrTwin = arr[0..^0];//arrTwin是arr的完成拷貝
foreach (var i in arrTwin)
{
Console.WriteLine(i);
}
var arrTwin2 = arr[..];//arr[0..^0];的簡(jiǎn)化版, 還等同于 arr[0..10];
foreach (var i in arrTwin2)
{
Console.WriteLine(i);
}
int[] arrTwin3 = arr[..];//完成的復(fù)制,數(shù)組
int[] allButFirst = arr[1..];//不包含第一個(gè)元素的數(shù)組
int[] empty = arr[^0..];//空數(shù)組
int[] onlyLastItem = arr[^1..];//只包含最后一個(gè)元素的數(shù)組
int[] last4Items = arr[^4..];//包含四個(gè)元素的數(shù)組
int lastItem = arr[^1];//最后一個(gè)元素,類型是int
- Range操作二維數(shù)組
循環(huán)訪問(wèn)位于中心的節(jié),不包括前三行和后三行,以及每個(gè)選定行中的前兩列和后兩列:
static void TestRange2()
{
var jagged = new int[10][]{
new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
new int[10] { 10,11,12,13,14,15,16,17,18,19},
new int[10] { 20,21,22,23,24,25,26,27,28,29},
new int[10] { 30,31,32,33,34,35,36,37,38,39},
new int[10] { 40,41,42,43,44,45,46,47,48,49},
new int[10] { 50,51,52,53,54,55,56,57,58,59},
new int[10] { 60,61,62,63,64,65,66,67,68,69},
new int[10] { 70,71,72,73,74,75,76,77,78,79},
new int[10] { 80,81,82,83,84,85,86,87,88,89},
new int[10] { 90,91,92,93,94,95,96,97,98,99},
};
var selectedRows = jagged[3..^3];
foreach (var row in selectedRows)
{
var selectedColumns = row[2..^2];
foreach (var cell in selectedColumns)
{
Console.WriteLine($"{cell}, ");
}
Console.WriteLine();
}
}
- Range的應(yīng)用場(chǎng)景
要分析較大序列的子范圍時(shí),通常會(huì)使用范圍和索引。 在準(zhǔn)確讀取所涉及的子范圍這一方面,新語(yǔ)法更清晰。 本地函數(shù)MovingAverage以 Range 為參數(shù)。 然后,該方法在計(jì)算最小值、最大值和平均值時(shí)僅枚舉該范圍。
static void TestRange3()
{
//同時(shí)返回多個(gè)值
(int min, int max, double average) MovingAverage(int[] subSequence, Range range) => (
subSequence[range].Min(),
subSequence[range].Max(),
subSequence[range].Average()
);
int[] Sequence(int count) => Enumerable.Range(0, count).Select(x => (int)(Math.Sqrt(x) * 100)).ToArray();
int[] sequence = Sequence(1000);
for (int start = 0; start < sequence.Length; start += 100)
{
Range r = start..(start + 10);
var (min, max, average) = MovingAverage(sequence, r);
Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\t{max},\tAverage: {average}");
}
for (int start = 0; start < sequence.Length; start += 100)
{
Range r = ^(start + 10)..^start;
var (min, max, average) = MovingAverage(sequence, r);
Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\tMax: {max},\tAverage: {average}");
}
}
總結(jié):
- Range類型;
一定要注意Range的范圍包括Start不包括End。
Range運(yùn)算符:..
Range應(yīng)用場(chǎng)景:分析較大序列的子范圍時(shí),通常會(huì)使用范圍和索引,語(yǔ)法更清晰 - Index類型;
從頭開(kāi)始的索引是從0開(kāi)始的
從尾部開(kāi)始的索引是從1開(kāi)始的,與序列的長(zhǎng)度相關(guān)。 - Hat 運(yùn)算符:
^