考虑下面有n个元素的int数组。
1, 3, 4, 5, 7
。在这个例子中,倒数第二项是5
。我想要得到数组中倒数第二个值之前的元素个数。倒数第二个元素之前有3个元素。我将把结果存储在一个int变量中以供稍后使用。显然,我们考虑到数组中总是有两个以上的元素。
这个数组每次的大小都不一样。
我怎样才能以最简单的方式实现这一点?
可以使用c# 8:
int[] arr = new int[]{1, 3, 4, 5, 7};
int[] newArr = arr.Length>=2 ? arr[..^2] : new int[0];
这将返回除最后2之外的所有元素,如果长度小于2则返回空数组。如果保证数组总是包含2个以上的元素,那么可以简化为:
int[] newArr = arr[..^2];
答案总是n-2,所以一个非常快速的解决方案是使用。length属性并减去2。
如果你只对数字的数量感兴趣,那么.Length-2
是最好的方法,因为其他人也说过。
如果你对项目也感兴趣,而不使用c# 8的特性,那么你可以使用ArraySegment
(1)。
它真的很强大,就像你可以在不影响底层数组的情况下反转项目。
int[] arr = new int[] { 1, 3, 4, 5, 7 };
var segment = new ArraySegment<int>(arr, 0, arr.Length - 2);
var reversedSegment = segment.Reverse(); //ReverseIterator { 4, 3, 1 }
//arr >> int[5] { 1, 3, 4, 6, 7 }
请记住,Span
(2)并非如此。
var segment = new Span<int>(arr, 0, arr.Length - 2);
segment.Reverse();
//arr >> int[5] {4, 3, 1, 6, 7 }
有一个ReadOnlySpan
,它不允许执行Reverse
这样的操作,
如果你需要,那么你必须以相反的顺序手动迭代。