C#的索引和范围运算符的用法

目录

一、索引Index和末尾运算符 ^的索引

二、范围Range和范围运算符..

1.规定

2.实例1

3.实例2:隐式范围运算符表达式转换 

4.实例3:交错数组循环访问

5.实例4:

6.实例5


        索引和范围为访问序列中的单个元素或范围提供了简洁的语法。依赖于两个新类型和两个新运算符。

System.Index 表示一个序列索引。
来自末尾运算符 ^ 的索引,指定一个索引与序列末尾相关。
System.Range 表示序列的子范围。
范围运算符 ..,用于将范围的开头和末尾指定为其操作数。

一、索引Index和末尾运算符 ^的索引

System.Index 表示一个序列索引。
来自末尾运算符 ^ 的索引,指定一个索引与序列末尾相关。

        考虑数组 sequence。 0 索引与 sequence[0] 相同。 ^0 索引与 sequence[sequence.Length] 相同。 表达式 sequence[^0] 会引发异常,就像 sequence[sequence.Length] 一样。 对于任何数字 n,索引 ^n 与 sequence.Length - n 相同。

string[] words = [// index from start    index from end"The",      // 0                   ^9"quick",    // 1                   ^8"brown",    // 2                   ^7"fox",      // 3                   ^6"jumps",    // 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]}");

二、范围Range和范围运算符..

System.Range 表示序列的子范围。
范围运算符 ..,用于将范围的开头和末尾指定为其操作数。

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[] quickBrownFox = words[1..4];
foreach (var word in quickBrownFox)Console.Write($"< {word} >");
Console.WriteLine();
//示例为开始和/或结束创建了开放范围:string[] allWords = words[..];     // 包括从"The"到"dog"的全部.
string[] firstPhrase = words[..4]; // 包括从"The"到"fox"
string[] lastPhrase = words[6..];  // 包括"the"到末尾
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();

2.实例1

        不仅数组支持索引和范围。 还可以将索引和范围用于 string、Span<T> 或 ReadOnlySpan<T>。

//索引和范围运算符
//AsSpan()
namespace ConsoleApp11
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);int[] numbers = [.. Enumerable.Range(0, 100)];int x = 12;int y = 25;int z = 36;Console.WriteLine($"{numbers[^x]} is the same as {numbers[^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.AsSpan()[x..y];Span<int> y_z = numbers.AsSpan()[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.AsSpan()[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.AsSpan()[..x];Span<int> zero_x = numbers.AsSpan()[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.AsSpan()[z..];Span<int> z_zero = numbers.AsSpan()[z..^0];Console.WriteLine($"\t{z_end[0]}..{z_end[^1]} is the same as {z_zero[0]}..{z_zero[^1]}");}}
}
//运行结果:
/*
88 is the same as 88
13 is the same as 13
numbers[x..y] and numbers[y..z] are consecutive and disjoint:numbers[x..y] is 12 through 24, numbers[y..z] is 25 through 35
numbers[x..^x] removes x elements at each end:numbers[x..^x] starts with 12 and ends with 87
numbers[..x] means numbers[0..x] and numbers[x..] means numbers[x..^0]0..11 is the same as 0..1136..99 is the same as 36..99*/

3.实例2:隐式范围运算符表达式转换 

        使用范围运算符表达式语法时,编译器会将开始值和结束值隐式转换为 Index,并根据这些值创建新的 Range 实例。

//以下代码显示了范围运算符表达式语法的隐式转换示例及其对应的显式替代方法:
//当值为负数时,从 Int32 隐式转换为 Index 会引发 ArgumentOutOfRangeException。
//同样,当 value 参数为负时,Index 构造函数会引发 ArgumentOutOfRangeException。namespace ConsoleApp12
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);Range implicitRange = 3..^5;Range explicitRange = new(start: new Index(value: 3, fromEnd: false),end: new Index(value: 5, fromEnd: true));if (implicitRange.Equals(explicitRange)){Console.WriteLine($"The implicit range '{implicitRange}' equals the explicit range '{explicitRange}'");}}}
}
// Sample output:
/*
The implicit range '3..^5' equals the explicit range '3..^5'*/

4.实例3:交错数组循环访问

        以下 .NET 类型同时支持索引和范围:String、Span<T> 和 ReadOnlySpan<T>。 List<T> 支持索引,但不支持范围。

        单个维度数组同时支持索引和范围。 多维数组不支持索引器或范围。 多维数组的索引器具有多个参数,而不是一个参数。 交错数组(也称为数组的数组)同时支持范围和索引器。

// 交错数组,循环访问
// 演示如何循环访问交错数组的矩形子[行]。
// 它循环访问位于中心的[行],不包括前三行和后三行,
// 以及每个选定行中的前两列和后两列
namespace ConsoleApp13
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);int[][] jagged =[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],[10,11,12,13,14,15,16,17,18,19],[20,21,22,23,24,25,26,27,28,29],[30,31,32,33,34,35,36,37,38,39],[40,41,42,43,44,45,46,47,48,49],[50,51,52,53,54,55,56,57,58,59],[60,61,62,63,64,65,66,67,68,69],[70,71,72,73,74,75,76,77,78,79],[80,81,82,83,84,85,86,87,88,89],[90,91,92,93,94,95,96,97,98,99],
];var selectedRows = jagged[3..^3];    //不包括前3行和后3行foreach (var row in selectedRows){var selectedColumns = row[2..^2];//遍历选中的行,范围[2..^2]foreach (var cell in selectedColumns){Console.Write($"{cell}, ");}Console.WriteLine();}}}
}
//运行结果:
/*
32, 33, 34, 35, 36, 37,
42, 43, 44, 45, 46, 47,
52, 53, 54, 55, 56, 57,
62, 63, 64, 65, 66, 67,*/

5.实例4:

        要分析较大序列的一部分时,通常会使用范围和索引。

// 范围和索引综合应用
namespace ConsoleApp14
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);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))];}}
}
//运行结果:
/*
From 0 to 10:           Min: 0, Max: 300,       Average: 192.7
From 100 to 110:        Min: 1000,      Max: 1044,      Average: 1021.6
From 200 to 210:        Min: 1414,      Max: 1445,      Average: 1429.5
From 300 to 310:        Min: 1732,      Max: 1757,      Average: 1744.4
From 400 to 410:        Min: 2000,      Max: 2022,      Average: 2010.6
From 500 to 510:        Min: 2236,      Max: 2256,      Average: 2245.6
From 600 to 610:        Min: 2449,      Max: 2467,      Average: 2458
From 700 to 710:        Min: 2645,      Max: 2662,      Average: 2653.7
From 800 to 810:        Min: 2828,      Max: 2844,      Average: 2835.9
From 900 to 910:        Min: 3000,      Max: 3014,      Average: 3006.9
From ^10 to ^0:         Min: 3146,      Max: 3160,      Average: 3153.1
From ^110 to ^100:      Min: 2983,      Max: 2998,      Average: 2990.2
From ^210 to ^200:      Min: 2810,      Max: 2826,      Average: 2818.2
From ^310 to ^300:      Min: 2626,      Max: 2643,      Average: 2634.8
From ^410 to ^400:      Min: 2428,      Max: 2447,      Average: 2437.9
From ^510 to ^500:      Min: 2213,      Max: 2233,      Average: 2223.2
From ^610 to ^600:      Min: 1974,      Max: 1997,      Average: 1985.5
From ^710 to ^700:      Min: 1702,      Max: 1729,      Average: 1715.5
From ^810 to ^800:      Min: 1378,      Max: 1410,      Average: 1394.2
From ^910 to ^900:      Min: 948,       Max: 994,       Average: 971.3*/

6.实例5

        从数组中获取范围时,结果是从初始数组复制的数组,而不是引用的数组。 修改生成的数组中的值不会更改初始数组中的值。

// 从数组中获取范围时,结果是从初始数组复制的数组,而不是引用的数组。
// 修改生成的数组中的值不会更改初始数组中的值。
namespace ConsoleApp15
{internal class Program{private static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);var arrayOfFiveItems = new[] { 1, 2, 3, 4, 5 };var firstThreeItems = arrayOfFiveItems[..3]; // 包括前3个firstThreeItems[0] = 11;                     // 修改序号0的元素为11Console.WriteLine(string.Join(",", firstThreeItems));Console.WriteLine(string.Join(",", arrayOfFiveItems));}}
}
// 运行结果:
/*
11,2,3
1,2,3,4,5*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医院患者满意度调查的意义

医院患者满意度调查具有重要的意义&#xff0c;对医疗机构和患者都有益处。以下是医院患者满意度调查的一些主要意义&#xff1a; 改进医疗质量&#xff1a; 通过了解患者的反馈和意见&#xff0c;医院可以识别并解决服务质量方面的问题。这有助于提高医疗护理的质量&#xff…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

行为型设计模式——备忘录模式

备忘录模式 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤&#xff0c;当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原&#xff0c;很多软件都提供了撤销&#xff08;Undo&#xff09;操作…

Acwing847 图中点的层次(bfs)

这道题用的是bfs&#xff0c;一开始用了dfs搜出了答案为4 题目 给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&…

【教程】微信小程序如何拍摄图片及视频并上传到后台进行存储

需求分析 在微信小程序中需要使用手机拍摄照片以及视频上传到后台进行进一步的操作&#xff0c;需要解决以下两个问题&#xff1a; 微信小程序如何拍摄照片及视频如何将拍摄的照片及视频上传到后台进行存储 解决方案 前端开发&#xff1a;微信小程序原生 后端开发&#xf…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

0x32 约数

0x32 约数 定义 若整数 n n n除以整数 d d d的余数为0&#xff0c;即 d d d能整除 n n n&#xff0c;则称 d d d是 n n n的约数&#xff0c; n n n是 d d d的倍数&#xff0c;记为 d ∣ n d|n d∣n。 算术基本定理的推论 在算术基本定理中&#xff0c;若正整数 N N N被唯一…

c 小熊猫 c++ IDE编译ffmpeg 设置

菜单-》运行-》编译器选项-》链接时加入下列选项 &#xff1a; -I /usr/local/ffmpeg/include -L /usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lm 本机ffmpeg存储位置&#xff1a;include &#xff1a;/usr/local/ff…

十三、QPalette的简单使用(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在实际应用中&#xff0c;经常需要改变某个控件的颜色外观&#xff0c;如背景、文字颜色等。Qt提供的调色板类 QPalette 专门用于管理对话框的外观显示。QPalette 类相当于对话框或是控件的调色板&…

metartc5_jz源码阅读-yang_rtcpush_on_rtcp_ps_feedback

// (Payload-specific FB messages&#xff0c;有效载荷反馈信息)&#xff0c;这个函数处理Payload重传 int32_t yang_rtcpush_on_rtcp_ps_feedback(YangRtcContext *context,YangRtcPushStream *pub, YangRtcpCommon *rtcp) {if (context NULL || pub NULL)return ERROR_RTC…

记录:排查create_ap偶发无法开启自发AP的问题

背景说明&#xff1a; 系统&#xff1a;Xubuntu16.04&#xff1b;内核&#xff1a;4.14&#xff1b;无线网卡&#xff1a;EDIMAX EW-7822UAC 关于无线网卡的驱动安装和create_ap配置参考博文&#xff1a;Xubuntu16.04系统中使用EDIMAX EW-7822UAC无线网卡开启5G自发AP 目录 问题…

分布式系统的三字真经CAP

文章目录 前言C&#xff08;Consistency 数据一致性&#xff09;A&#xff08;Availability 服务可用性&#xff09;P&#xff08;Partition Tolerance 分区容错性&#xff09;CAP理论最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我一起探索一下分布式系统的三字真经C…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

解决ssh: connect to host github.com port 22: Connection refused

ssh: connect to host github.com port 22: Connection refused 是连接github.com的端口号22拒绝连接。 可以使用github的443端口。 解决方案 在~/.ssh/config中添加如下字段&#xff1a; $ vim ~/.ssh/config # 如果没有config 文件就新建一个 Host github.comHostname ss…

Jmeter 性能-监控服务器

Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip) JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip) ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Perform…

xtu-c语言考试复习-2

1223 确实写不出&#xff0c;数据远超过64位&#xff0c;难道用数组存吗&#xff0c;但是不好计算&#xff0c;想到的思路是取模&#xff0c;一边计算&#xff0c;一边取模&#xff0c;就不会超过数据范围&#xff0c;但是数学原理没懂&#xff0c;所以做不出来 看了下自己以…

AIGC视频生成:Pika1.0快速入门详解

Pika1.0快速入门详解 一、简介二、登录三、参数设置1、改变画面大小&#xff08;Aspect ratio&#xff09;2、改变帧数大小&#xff08;Frames per second&#xff09;3、镜头平移&#xff08;Camera control&#xff09;4、画面运动控制&#xff08;Strength of motion&#x…

VCG 网格面片法向量平滑

文章目录 一、简介二、实现代码三、实现效果一、简介 思路其实很简单,即是将当前面的法线替换为该面相邻面的法线的平均值,当前邻近法线需要根据邻近面片的面积进行加权。虽然思路很简单,但是很有效,这对一些重建算法效果也有所提升。 二、实现代码 //VCG #include <vc…

永不停止,永远在路上!MIAOYUN 2023年度回顾

2023 MIAOYUN年度关键词&#xff1a;坚持/沉淀/成长 2023年&#xff0c;我们身处虚浮遥荡的世界&#xff1a;支原体肺炎、流感接二连三、经济下行成热词、人人思危&#xff1b;更有暴雨成灾&#xff0c;核污水扩散&#xff0c;战火与地震不断。 坏事发生时&#xff0c;你有三种…