91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

帶你了解c#的索引和范圍

發布時間:2020-10-28 20:28:11 來源:億速云 閱讀:152 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關帶你了解c#的索引和范圍,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

范圍和索引為訪問序列中的單個元素或范圍提供了簡潔的語法。

在本教程中,你將了解:

  • 對某個序列中的范圍使用該語法。
  • 了解每個序列開頭和末尾的設計決策。
  • 了解 Index 和 Range 類型的應用場景。

對索引和范圍的語言支持

此語言支持依賴于兩個新類型和兩個新運算符:

  • System.Index 表示一個序列索引。
  • 來自末尾運算符 ^ 的索引,指定一個索引與序列末尾相關。
  • System.Range 表示序列的子范圍。
  • 范圍運算符 ..,用于指定范圍的開始和末尾,就像操作數一樣。
     

讓我們從索引規則開始。 請考慮數組 sequence0 索引與 sequence[0] 相同。 ^0 索引與 sequence[sequence.Length] 相同。 表達式 sequence[^0] 不會引發異常,就像 sequence[sequence.Length] 一樣。 對于任何數字 n,索引 ^nsequence[sequence.Length - n] 相同。

string[] words = new string[]
{
        // index from start  index from end
  "The",   // 0          ^9
  "quick",  // 1          ^8
  "brown",  // 2          ^7
  "fox",   // 3          ^6
  "jumped",  // 4          ^5
  "over",   // 5          ^4
  "the",   // 6          ^3
  "lazy",   // 7          ^2
  "dog"    // 8          ^1
};       // 9 (or words.Length) ^0

可以使用 ^1 索引檢索最后一個詞。 在初始化下面添加以下代碼:

Console.WriteLine($"The last word is {words[^1]}");

范圍指定范圍的開始和末尾。 范圍是排除的,也就是說“末尾”不包含在范圍內。 范圍 [0..^0] 表示整個范圍,就像 [0..sequence.Length] 表示整個范圍。
以下代碼創建了一個包含單詞“quick”、“brown”和“fox”的子范圍。 它包括 words[1] 到 words[3]。 元素 words[4] 不在該范圍內。 將以下代碼添加到同一方法中。 將其復制并粘貼到交互式窗口的底部。

string[] quickBrownFox = words[1..4];
foreach (var word in quickBrownFox)
  Console.Write($"< {word} >");
Console.WriteLine();

以下代碼使用“lazy”和“dog”返回范圍。 它包括 words[^2]words[^1]。 結束索引 words[^0] 不包括在內。 同樣添加以下代碼:

string[] lazyDog = words[^2..^0];
foreach (var word in lazyDog)
  Console.Write($"< {word} >");
Console.WriteLine();

下面的示例為開始和/或結束創建了開放范圍:

string[] allWords = words[..]; // contains "The" through "dog".
string[] firstPhrase = words[..4]; // contains "The" through "fox"
string[] lastPhrase = words[6..]; // contains "the, "lazy" and "dog"
foreach (var word in allWords)
  Console.Write($"< {word} >");
Console.WriteLine();
foreach (var word in firstPhrase)
  Console.Write($"< {word} >");
Console.WriteLine();
foreach (var word in lastPhrase)
  Console.Write($"< {word} >");
Console.WriteLine();

還可以將范圍或索引聲明為變量。 然后可以在 [ 和 ] 字符中使用該變量:

Index the = ^3;
Console.WriteLine(words[the]);
Range phrase = 1..4;
string[] text = words[phrase];
foreach (var word in text)
  Console.Write($"< {word} >");
Console.WriteLine();

下面的示例展示了使用這些選項的多種原因。 請修改 x、y 和 z 以嘗試不同的組合。 在進行實驗時,請使用 x 小于 y且 y 小于 z 的有效組合值。 在新方法中添加以下代碼。 嘗試不同的組合:

int[] numbers = Enumerable.Range(0, 100).ToArray();
int x = 12;
int y = 25;
int z = 36;

Console.WriteLine($"{numbers[^x]} is the same as {numbers[numbers.Length - x]}");
Console.WriteLine($"{numbers[x..y].Length} is the same as {y - x}");

Console.WriteLine("numbers[x..y] and numbers[y..z] are consecutive and disjoint:");
Span<int> x_y = numbers[x..y];
Span<int> y_z = numbers[y..z];
Console.WriteLine($"\tnumbers[x..y] is {x_y[0]} through {x_y[^1]}, numbers[y..z] is {y_z[0]} through {y_z[^1]}");

Console.WriteLine("numbers[x..^x] removes x elements at each end:");
Span<int> x_x = numbers[x..^x];
Console.WriteLine($"\tnumbers[x..^x] starts with {x_x[0]} and ends with {x_x[^1]}");

Console.WriteLine("numbers[..x] means numbers[0..x] and numbers[x..] means numbers[x..^0]");
Span<int> start_x = numbers[..x];
Span<int> zero_x = numbers[0..x];
Console.WriteLine($"\t{start_x[0]}..{start_x[^1]} is the same as {zero_x[0]}..{zero_x[^1]}");
Span<int> z_end = numbers[z..];
Span<int> z_zero = numbers[z..^0];
Console.WriteLine($"\t{z_end[0]}..{z_end[^1]} is the same as {z_zero[0]}..{z_zero[^1]}");

索引和范圍的類型支持

索引和范圍提供清晰、簡潔的語法來訪問序列中的單個元素或元素的范圍。 索引表達式通常返回序列元素的類型。 范圍表達式通常返回與源序列相同的序列類型。
若任何類型提供帶 Index 或 Range 參數的索引器,則該類型可分別顯式支持索引或范圍。 采用單個 Range 參數的索引器可能會返回不同的序列類型,如 System.Span<T>。

重要

使用范圍運算符的代碼的性能取決于序列操作數的類型。
范圍運算符的時間復雜度取決于序列類型。 例如,如果序列是 string 或數組,則結果是輸入中指定部分的副本,因此,時間復雜度為 O(N)(其中 N 是范圍的長度)。 另一方面,如果它是 System.Span<T> System.Memory<T>,則結果引用相同的后備存儲,這意味著沒有副本且操作為 O(1)。
除了時間復雜度外,這還會產生額外的分配和副本,從而影響性能。 在性能敏感的代碼中,考慮使用 Span<T>Memory<T> 作為序列類型,因為不會為其分配范圍運算符。

若類型包含名稱為 Length Count 的屬性,屬性有可訪問的 Getter 并且其返回類型為 int,則此類型為可計數類型。**** 不顯式支持索引或范圍的可計數類型可能為它們提供隱式支持。 有關詳細信息,請參閱功能建議說明的隱式索引支持和隱式范圍支持部分。 使用隱式范圍支持的范圍將返回與源序列相同的序列類型。
例如,以下 .NET 類型同時支持索引和范圍:String、Span<T> 和 ReadOnlySpan<T>。 List<T> 支持索引,但不支持范圍。
Array 具有更多的微妙行為。 單個維度數組同時支持索引和范圍。 多維數組則不支持。 多維數組的索引器具有多個參數,而不是一個參數。 交錯數組(也稱為數組的數組)同時支持范圍和索引器。 下面的示例演示如何循環訪問交錯數組的矩形子節。 它循環訪問位于中心的節,不包括前三行和后三行,以及每個選定行中的前兩列和后兩列:

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.Write($"{cell}, ");
  }
  Console.WriteLine();
}

在所有情況下,Array 的范圍運算符都會分配一個數組來存儲返回的元素。

索引和范圍的應用場景

要分析較大序列的一部分時,通常會使用范圍和索引。 在準確讀取所涉及的序列部分這一方面,新語法更清晰。 本地函數 MovingAverageRange 為參數。 然后,該方法在計算最小值、最大值和平均值時僅枚舉該范圍。 在項目中嘗試以下代碼:

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},\tMax: {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}");
}

(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();

上述就是小編為大家分享的帶你了解c#的索引和范圍了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建瓯市| 利川市| 天柱县| 沙洋县| 赤城县| 古田县| 辉县市| 舟山市| 沁源县| 托克逊县| 东明县| 陆河县| 彭泽县| 上饶市| 望奎县| 长子县| 黔南| 攀枝花市| 沈阳市| 德昌县| 扎鲁特旗| 罗山县| 岗巴县| 吉安市| 特克斯县| 莱西市| 安宁市| 宁波市| 济源市| 锦屏县| 元江| 新平| 交城县| 准格尔旗| 镇江市| 建德市| 海门市| 灯塔市| 杂多县| 绥阳县| 民县|