C# 三角形阵列的最佳数据存储类型是什么?

C# 三角形阵列的最佳数据存储类型是什么?,c#,arrays,multidimensional-array,C#,Arrays,Multidimensional Array,是否有一个数组或数据类型eg,它支持将值特别是字符串排列成这样的三角形 1 2 3 4 5 6 在我上面的示例中,这些数字中的每一个都包含一个字符串的2个字符的值。如果我的绳子是“你好,我是一只猫”,它会被分成两部分 我希望我的程序将这些值存储在一个类似于上面三角形的数组中-这是如何实现的?是否有一种方法可以移动这些值,例如1=2=3=4。仅将其存储在数组中有什么错?偏移量都是在典型的算术序列中定义的,即第1行在0处,第2行在1处,第3行在3处等 因此,您将拥有的数组:[1,2,3,4,5,6

是否有一个数组或数据类型eg,它支持将值特别是字符串排列成这样的三角形

1
2 3
4 5 6
在我上面的示例中,这些数字中的每一个都包含一个字符串的2个字符的值。如果我的绳子是“你好,我是一只猫”,它会被分成两部分


我希望我的程序将这些值存储在一个类似于上面三角形的数组中-这是如何实现的?是否有一种方法可以移动这些值,例如1=2=3=4。

仅将其存储在数组中有什么错?偏移量都是在典型的算术序列中定义的,即第1行在0处,第2行在1处,第3行在3处等

因此,您将拥有的数组:[1,2,3,4,5,6,…]

Row #1 offset: 0;  // Base
Row #2 offset: (1) = 1;
Row #3 offset: (1 + 2) = 3;
Row #4 offset: (1 + 2 + 3) = 6;
Row #5 offset: (1 + 2 + 3 + 4) = 10;
等等等等。第n行的偏移量是将一到n-1相加

这样做的好处是,在构建这个三角形的过程中,您可以继续将ing添加到数组的末尾。如果您用分隔符分割字符串,string.split数组的输出可能已经是您所需要的了


要移动/移动元素,只需在前面添加一个元素!偏移都是相同的,但每个元素都将移动到下一个位置

仅将其存储在阵列中有什么不对?偏移量都是在典型的算术序列中定义的,即第1行在0处,第2行在1处,第3行在3处等

因此,您将拥有的数组:[1,2,3,4,5,6,…]

Row #1 offset: 0;  // Base
Row #2 offset: (1) = 1;
Row #3 offset: (1 + 2) = 3;
Row #4 offset: (1 + 2 + 3) = 6;
Row #5 offset: (1 + 2 + 3 + 4) = 10;
等等等等。第n行的偏移量是将一到n-1相加

这样做的好处是,在构建这个三角形的过程中,您可以继续将ing添加到数组的末尾。如果您用分隔符分割字符串,string.split数组的输出可能已经是您所需要的了


要移动/移动元素,只需在前面添加一个元素!偏移都是相同的,但每个元素都将移动到下一个位置

存储此数据的最佳物理数据类型是列表或数组。但是,您可以很容易地编写一个类来抽象计算偏移量等

public class Triangle<T> {
    private List<T> list = new List<T>();

    private int rows;
    public int Rows { get { return rows; } }

    private void CalculateRows() {
        rows = (int)Math.Ceiling(Math.Sqrt(list.Count * 2 + 0.25) - 0.5);
    }

    public void Add(T item) {
        list.Add(item);
        CalculateRows();
    }

    public T this[int column, int row] {
        get {
            if (row < 0 || row > Rows - 1) {
                throw new ArgumentOutOfRangeException("row");
            }

            if (column < 0 || column > row) {
                throw new ArgumentOutOfRangeException("column");
            }

            int rowOffset = row * (row + 1) / 2;
            return list[rowOffset + column];
        }
    }

    public int ColumnsForRow(int row) {
        if (row < 0 || row > Rows - 1) {
            throw new ArgumentOutOfRangeException("row");
        }

        if (row < Rows - 1) {
            return row + 1;
        }

        return list.Count - (row * (row + 1) / 2);
    }

    public void ShiftLeft() {
        list.Add(list[0]);
        list.RemoveAt(0);
    }

    public void ShiftRight() {
        list.Insert(0, list[list.Count - 1]);
        list.RemoveAt(list.Count - 1);
    }
}

存储此数据的最佳物理数据类型是列表或数组。但是,您可以很容易地编写一个类来抽象计算偏移量等

public class Triangle<T> {
    private List<T> list = new List<T>();

    private int rows;
    public int Rows { get { return rows; } }

    private void CalculateRows() {
        rows = (int)Math.Ceiling(Math.Sqrt(list.Count * 2 + 0.25) - 0.5);
    }

    public void Add(T item) {
        list.Add(item);
        CalculateRows();
    }

    public T this[int column, int row] {
        get {
            if (row < 0 || row > Rows - 1) {
                throw new ArgumentOutOfRangeException("row");
            }

            if (column < 0 || column > row) {
                throw new ArgumentOutOfRangeException("column");
            }

            int rowOffset = row * (row + 1) / 2;
            return list[rowOffset + column];
        }
    }

    public int ColumnsForRow(int row) {
        if (row < 0 || row > Rows - 1) {
            throw new ArgumentOutOfRangeException("row");
        }

        if (row < Rows - 1) {
            return row + 1;
        }

        return list.Count - (row * (row + 1) / 2);
    }

    public void ShiftLeft() {
        list.Add(list[0]);
        list.RemoveAt(0);
    }

    public void ShiftRight() {
        list.Insert(0, list[list.Count - 1]);
        list.RemoveAt(list.Count - 1);
    }
}

列表对你有用吗?那么你想要一个数据结构,当你称之为.add and.remove时,它将存储到一个二维锯齿数组中,谁的索引类似于三角形?列表对你有用吗?那么你想要一个数据结构,当你称之为.add and.remove时,它将存储到一个二维锯齿数组中,谁的索引类似于三角形?