我正在寻找“滑动阵列”

时间:2019-11-26 09:50:31

标签: c#

是否有某些东西可以在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的字典用作模板会更好吗?

编辑: 我不仅会移动这些数据,我还将使用此数据来计算某些内容。因此,我认为Queue不会对此有所帮助。

我需要这种方法。在这种方法中,我仅对array [6,2]执行此操作。 现在我想我需要更多地了解我的历史。所以我将拥有array [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;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

没有您想要的特定数据结构。此外,您已经提到添加元素不会经常发生...因此,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。

答案 1 :(得分:0)

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

您应该定义自己的周期长度n,并保持current_index到达0索引时会回绕到n-1

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;
    }
}