【问题标题】:How to specify the bounds of an array如何指定数组的边界
【发布时间】:2020-08-28 07:38:13
【问题描述】:

我尝试指定数组的边界:

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 个值。

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

【问题讨论】:

  • 您是在问如何获取数组的子集吗?请参阅here。如果您只是想创建一个具有任意下限和上限的数组,那么这是不可能的。只能定义数组的长度,下限始终为0。
  • @John - 我相信他们在问如何设置数组的范围,例如编号从 x 开始,然后转到 y
  • 您可以使用数组和偏移量创建自己的类型。
  • C# 没有这种功能。数组有长度并且从零开始。您可以编写一个类来实现它,但这对于基本上是语法糖的东西来说有点费力。
  • @John 好的,所以解决方案是确定我的 MinScale 和我的 MaxScale 之间的值的数量。有了这个长度,我可以确定我的新数组。

标签: c# arrays bounds


【解决方案1】:

如果真的取决于您在这里尝试做什么。数组的边界在创建时是固定的,对于 vectorstring[] 是一个向量),它始终从零开始。如果您想要一个实际数组,那么您需要将子范围复制到第二个数组中 - 只需 new 正确大小的数组和 Array.Copy 您的元素范围想要 - 即Array.Copy(source, startIndex, destination, 0, count);。但是,种方法可以表示一个范围而不复制:

  • 如果接收者只需要迭代数据(而不是通过索引访问),IEnumerable&lt;T&gt; - 即return source.Skip(firstIndex).Take(count);
  • Span&lt;T&gt;ReadOnlySpan&lt;T&gt;,即 return new Span&lt;string&gt;(source, firstIndex, count) - “span”的工作方式与数组非常相似,不需要任何复制,并且无需分配;适当地应用偏移量等;请注意,一旦有了跨度,.Slice(...) 在该跨度内创建越来越小的子部分,同样无需任何复制或分配
    • 这里的一件好事是,如果需要,您可以使用 span 方法作为处理创建新 数组 的一种更简单的方法 - 一旦您拥有 [ReadOnly]Span&lt;T&gt;,您就可以使用 @987654332 @ 用这些内容创建一个新数组
  • Memory&lt;T&gt;ReadOnlyMemory&lt;T&gt; 实际上是“我可以在你想要的时候给你一个跨度”——因为你不能将一个“跨度”存储为一个字段(它只在堆栈上是合法的),但是你 可以储存“记忆”
  • ArraySegment&lt;T&gt; 是一个较老的隐喻,用于表示具有偏移量和计数的数组;它依赖于调用者正确地做所有事情

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多