三角形arrays的最佳数据存储类型是什么?

是否有一个数组或数据类型(例如 )支持将值(特别是字符串)排列成这样的三角形…

 1 2 3 4 5 6 

在上面的例子中,这些数字中的每一个都包含一个字符串的2个字符的值。 如果我的字符串是"Hello I am a cat" ,那么它将被分成"He ll oI am ac at"那里"He ll oI am ac at"

我希望我的程序将这些值存储在类似于上面三角形的数组中 – 如何实现? 有没有办法让值移动(例如1=2 2=3 3=4 )。

将它存储在数组中有什么问题? 在典型的算术序列中,所有偏移都被定义(即,行#1为0,行#2为1,行#3为3等)。

那么,你将拥有的arrays:[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的偏移量是加1到n-1

好处是,在构建这个三角形时,你可以将“添加” – 保持到数组的末尾。 如果将字符串拆分为某个分隔符,则string.Split (数组)的输出可能已经是您所需要的!

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

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

 public class Triangle { private List list = new List(); 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); } }