c# Range/Index范圍和索引

  • 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ù) MovingAverageRange 為參數(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)算符:^
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Win7下如何打開(kāi)DOS控制臺(tái)? a:開(kāi)始--所有程序--附件--命令提示符 b:開(kāi)始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,709評(píng)論 4 12
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,851評(píng)論 0 3
  • 2.變量和基本類型 3.字符串、向量和數(shù)組 4.表達(dá)式 5.語(yǔ)句 2.變量和基本類型 c++的算術(shù)類型: 一個(gè)ch...
    暮落晴空閱讀 806評(píng)論 0 0
  • 基礎(chǔ) .NET概述 參考:http://www.cnblogs.com/yplong/p/3279934.html...
    donite閱讀 1,731評(píng)論 0 8
  • Comment your JavaScript Code JavaScript中的注釋方式有以下兩種: 使用 //...
    歸云丶閱讀 1,202評(píng)論 0 0

友情鏈接更多精彩內(nèi)容