【问题标题】:I am looking for "sliding array"我正在寻找“滑动阵列”
【发布时间】:2020-03-21 16:52:35
【问题描述】:

有什么东西可以让C# 创建数组,例如int[6,10]。 并且总是当我添加新元素[i,0]时,这一行中的所有元素都会移动+1。最后将删除。

现在我必须这样做:

 array[i, 2] = array[i, 1];
 array[i, 1] = array[i, 0];
 array[i, 0] = value;

例如使用带有 int 和 List 的字典会更好吗?

编辑: 我不仅移动这些数据,我还将使用这些数据来计算一些东西。所以我认为队列不会对此有好处。

我需要这样的方法。在这种方法中,我只为数组 [6,2] 执行此操作。 现在我想我需要更多地了解我的历史。所以我会有数组[6,10]。 我将检查不同的情况并创建依赖项。我需要一些东西,让它看起来尽可能清晰并快速工作。

 public static double CalculateLastValue(double value, KalmanModel k, int i)
    {
        if (k.LastDistance[i, 0] == 0 && k.LastDistance[i, 1]==0)
        {
            k.LastDistance[i, 0] = value;
            k.LastDistance[i, 1] = value;
        }
        if (k.LastDistance[i, 0] == k.LastDistance[i, 1])
        {

            if (Math.Abs(value - k.LastDistance[i, 0]) > 2 && value < k.LastDistance[i, 0])
            {
                value = k.LastDistance[i, 0] - 2;
            }
            else if (Math.Abs(value - k.LastDistance[i, 0]) > 2 && value > k.LastDistance[i, 0])
            {
                value = k.LastDistance[i, 0] + 2;
            }
            k.LastDistance[i, 1] = k.LastDistance[i, 0];
            k.LastDistance[i, 0] = value;
            return value;
        }
        else if (k.LastDistance[i, 0] > k.LastDistance[i, 1])
        {
            if (value >= k.LastDistance[i, 0])
            {
                if (Math.Abs(value - k.LastDistance[i, 0]) > 2)
                {
                    value = k.LastDistance[i, 0] + 2;
                }
                k.LastDistance[i, 1] = k.LastDistance[i, 0];
                k.LastDistance[i, 0] = value;
                return value;
            }
            else
            {
                value = k.LastDistance[i, 0];
                k.LastDistance[i, 1] = k.LastDistance[i, 0];
                return value;
            }
        }
        else 
        {
            if (value <= k.LastDistance[i, 0])
            {
                if (Math.Abs(value - k.LastDistance[i, 0]) > 2)
                {
                    value = k.LastDistance[i, 0] - 2;
                }
                k.LastDistance[i, 1] = k.LastDistance[i, 0];
                k.LastDistance[i, 0] = value;
                return value;
            }
            else
            {
                value = k.LastDistance[i, 0];
                k.LastDistance[i, 1] = k.LastDistance[i, 0];
                return value;
            }
        }
    }

【问题讨论】:

标签: c#


【解决方案1】:

.NET 中没有这样的数据结构。但这并不意味着您需要的东西无法构建。

你应该定义你的循环长度,n,并保持一个current_index,当它到达n-1索引时,它会环绕到0

class wrapping_array
{
    public wrapping_array(int cycle)
    {
         n = cycle;
         array = new int[cycle];
    }

    public int this[int index]
    {
        get => array[index];
        set => array[index] = value;
    }

    int n, index;
    int[] array;

    public int insert(int value)
    {
        array[index++%n]=value;
    }
}

【讨论】:

  • 100% 有很多数据结构可以做到这一点
  • 想在 cmets 中链接一些?
  • this[int index]中的数组访问不应该也改成array[(this.index+index)%n]吗?那可能会感觉更“自然”。如果请求的索引是&lt;0&gt;=n,也会抛出?
  • 我很烦人,但如果你想关注official guidelines,你不应该在 C# 中使用snake_case。
【解决方案2】:

您想要的没有特定的数据结构。此外,您已经提到添加元素不会经常发生……所以 KIS:保持简单。

您可以编写一个辅助函数,例如:

public static void PushElement<T>(ref T[,] arr, int index, T value)
{
    var len1 = arr.GetLength(1);
    Array.Copy(arr, index * len1, arr, index * len1 + 1, len1 - 1);
    arr[index, 0] = value;
}

public static void Main()
{
    int[,] arr = { { 1, 2, 3 }, { 4, 5, 6 } };

    PushElement(ref arr, 1, 7);

arr[1,:] 现在将包含 7,4,5。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多