如何指定数组的边界

How to specify the bounds of an array

我尝试指定数组的边界:

public string[] scaleChanged()
{
    int j =0;
    for(int i=0;i<42;i++)
    {
        if(MinScale == ItemScale[i]) //MinScale is the min value I want to use to start array
        {
            ItemsScale[j] = MinScale; //ItemScal is an array of 42 string
            for(int h =0; h<42-i; h++)
            {
                ItemScale[j+1] = ItemScale[i];
                j++;
                if(ItemScale[j] == MaxScale) //MaxScale is my max value I want to use for stop my array
                {
                    return ItemScale[ ???MinScale to MaxScale];
                }
            }
        }
    }
}

所以我从一个允许我指定数组边界的服务器中恢复了 2 个值。

所以我尝试用这两个值定义一个新数组 bounds.I 准确地说,这个“两个值”总是在我的 ItemScale 数组中的任何地方声明(这就是我使用比较的原因)。

是否真的取决于您在这里尝试做什么。数组的边界在创建时是固定的,在 vector 的情况下(string[] 是一个向量),它总是 zero-based。如果你想要一个 实际数组 ,那么你需要将 sub-range 复制到第二个数组中 - 只是 new 正确大小的数组,并且Array.Copy 您想要的元素范围 - 即 Array.Copy(source, startIndex, destination, 0, count);。但是, 种方式来表示范围而无需 复制:

  • 如果接收方只需要迭代数据(而不是通过索引访问它),一个 IEnumerable<T> - 即 return source.Skip(firstIndex).Take(count);
  • Span<T>ReadOnlySpan<T>,即 return new Span<string>(source, firstIndex, count) - “跨度”的工作方式很像数组,不需要任何复制,并且是 allocation-free;适当应用偏移等;请注意,一旦你有了一个跨度,.Slice(...) 在该跨度内创建越来越小的 sub-sections,同样没有任何复制或分配
    • 这里的一件好事是,您可以使用 span 方法作为处理创建新 array 的更简单方法,如果您愿意的话 - 一旦您有了 [ReadOnly]Span<T>,您可以使用 .ToArray() 创建一个包含这些内容的新数组
  • Memory<T>ReadOnlyMemory<T> 实际上是“我可以在你想要的时候给你一个跨度”——因为你不能将“跨度”存储为一个字段(它只在栈),但是你可以存储“内存”
  • ArraySegment<T> 是用偏移量和计数表示数组的较旧隐喻;它依赖于调用者正确地做所有事情