C# 8.0的新功能三——简化的数组操作

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

C#8.0新功能系列中断了好久,今天又重新起航了,每天学习进步一点点~~~

1.数组操作的传统做法

有过数组学习经验的人,应该都知道数组的访问可以按照下标直接访问,那么最直接的数组访问方式也即如此。

如果需要访问数组的后几个字母,那么我们只需要获取数组总长度,然后减去从后数的个数即可。

当然c#也提供了Linq查询方式,我们可以利用 Skip,Take组合获取指定位置的字母。

例子代码如下:

string[] letters = { "A", "B", "C", "D", "E", "F", "G", "H" };
string firstLetter = letters[0];
string secondLetter = letters[1];
string lastLetter = letters[letters.Length - 1];
string penultimateLetter = letters[letters.Length - 2];

string[] middleTwoLetters = letters.Skip(2) 
                                   .Take(2) 
                                   .ToArray();

string[] everythingExceptFirstAndLast = letters.Skip(1) 
                                               .Take(letters.Length - 2) 
                                               .ToArray();

Console.WriteLine($"{firstLetter},{secondLetter},{lastLetter},{penultimateLetter}");

Console.WriteLine($"middleTwoLetters:{string.Join(",",middleTwoLetters)}");
Console.WriteLine($"everythingExceptFirstAndLast:{string.Join(",", everythingExceptFirstAndLast)}");
复制代码
A,B,H,G
middleTwoLetters:C,D
everythingExceptFirstAndLast:B,C,D,E,F,G
复制代码

2. C#引入 ^,倒叙查找元素

^ N ,N表示数组的长度,因此 ^1表示倒数最后一个元素。

例如上面的代码可以简化为如下代码:

string[] letters = { "A", "B", "C", "D", "E", "F", "G", "H" };
string firstLetter = letters[0];
string secondLetter = letters[1];
string lastLetter = letters[^1];
string penultimateLetter = letters[^2];

string[] middleTwoLetters = letters[2..4];

string[] everythingExceptFirstAndLast = letters[1..^1];

Console.WriteLine($"{firstLetter},{secondLetter},{lastLetter},{penultimateLetter}");

Console.WriteLine($"middleTwoLetters:{string.Join(",",middleTwoLetters)}");
Console.WriteLine($"everythingExceptFirstAndLast:{string.Join(",", everythingExceptFirstAndLast)}");
复制代码

打印如下结果

A,B,H,G
middleTwoLetters:C,D
everythingExceptFirstAndLast:B,C,D,E,F,G
复制代码

除了新引入的 ^N索引符号外,还引入了 范围运算符 .. ,这允许你指定元素的范围,例如代码中的[2..4]就给了我们字母 C 和D,或者,换句话说,它给了我们从2开始到4结束的元素范围。

注意,最后一个索引是不包含的,意思是,包含2,不包含4的范围。

当然,你可以使用开放范围,表示直到开始或结束,例如: [^3..] , [..5]

为了使新索引功能起作用,C# 引入了 Index的新结构,为了兼容范围作用域,也同样的有一个Range的新结构。

你可以直接使用这两个结构定义代码。

Index index = new Index(5, true);
string tmp = letters[index];

Range middleTwo = new Range(2, 4);
string[] tmp2 = letters[middleTwo];
复制代码

当然,你在范围运算符内也可以混用end运算符:

string[] lastThreeLetters = letters[^3..^0]; //E,F,G
string tmp3 = letters[^0]; //IndexOutOfRangeException
复制代码

这里,第一个 ^0 表示数组的末尾,因为范围的结尾是不包含的,因此不会有异常;然而 当做索引,就会产生 IndexOutOfRangeException异常。

3.小结

当然有些新的类型也支持 倒排索引和范围,具体的类需要参考具体的文档,这里不再赘述。

看完这篇短文,你是不是又掌握了一种精简代码的方式?

感谢有你的陪伴,技术的路上不孤单~~

我是 webmote, 关注我,学习的路上不迷路!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享