与其他语言相比,C#在有效处理数据的能力方面落后。 好吧,那些日子已经过去了。 Microsoft刚刚改进了C#语法,使开发人员可以更轻松地管理数组中的数据。
操纵数组
您是否曾经不得不操纵多个数组中的大量数据? 当然有! 而且我想您的经验还不是很好。 与其他语言相比,C#在有效处理数据的能力方面落后。 好吧,那些日子已经过去了。 Microsoft刚刚改进了C#语法,使开发人员可以更轻松地管理数组中的数据。
新家伙
C#8.0中引入了两个新的运算符,以为您提供所需的全部功能:
- '来自结尾的索引'运算符:
^
,它指定相对于序列结尾的索引; 和 - “范围”运算符:
..
,它指定范围的开始和结束。
重要笔记
-
^0
索引与sequence[sequence.Length]
相同。 - 注意,
sequence[^0]
确实会抛出IndexOutOfRangeException
,就像sequence[sequence.Length]
一样。 - 对于任何数字n ,索引
^n
与sequence.Length - n
相同。 - 对于范围,范围的开始是包含的 ,但范围的结束是排除的 。
- 范围
[0..0^]
代表整个序列,就像[0..sequence.Length]
或[..]
。 - 范围不需要完全定义,
- 例如
-
[..3]
->给我从数组开始到索引3的所有内容。 -
[2..]
->给我从索引2到数组末尾的所有内容。 -
[..]
->给我一切
例子
困惑? 我保证在这之后一切都会有意义。 让我们看几个例子。
private 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
};
如您所见,
words[^0]
等于words[9]
,超出范围
再给我一些
好吧好吧。 这里有一些更多的使用方法。
var allWords = words[..]; // contains "The" through "dog".
var firstPhrase = words[. .4 ]; // contains "The" through "fox".
var lastPhrase = words[ 6. .]; // contains "the, "lazy" and "dog".
var lazyDog = words[^ 2. .^ 0 ]; // contains "lazy" and "dog".
Index
和Range
也是.NET类型,这意味着您可以创建这些类型的变量,为代码清晰起见对其进行命名,然后反复使用它们。
Index the = ^ 3 ;
words[the];
Range phrase = 1. .4 ;
words[phrase];
结论
这是超级强大的功能,我迫不及待想在我的项目中使用它。 这将在减少使用索引计算时的噪音以及使代码更易于维护方面有很大帮助。 感谢Microsoft为❤️语言提供的这一出色补充。
参考文献
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8