如何在C#中表示可扩展的2D数组?

时间:2017-07-28 11:24:09

标签: c# data-structures types

我需要的是一个可以随时使用新列(以及行)扩展的表。使用DataTable似乎有些过分,因为我不需要任何关系功能或数据绑定,而我确实需要对相当大量的数据进行高速操作(例如,存储一百万行的某些列并且能够添加例如快速推出数百个新专栏。

至于现在,最好的方法似乎是预先分配一个冗余大小的简单2D数组。有没有更好的方法?

1 个答案:

答案 0 :(得分:2)

没有内置类可以提供此功能,除非已经提到public class Table<T> { private readonly List<List<T>> columns; public Table() { columns = new List<List<T>>(); } public IEnumerable<IEnumerable<T>> Columns => columns.Select(c => c.Select(r => r)); public IEnumerable<IEnumerable<T>> Rows { get { IEnumerable<T> getRow(int index) { foreach (var c in columns) { yield return c[index]; } } for (var row = 0; row < Count; row++) { yield return getRow(row); } } } public int Count => columns.Count == 0 ? 0 : columns[0].Count; public T this[int row, int column] { get { return columns[column][row]; } set { columns[column][row] = value; } } public void AddRow() { foreach (var c in columns) { c.Add(default(T)); } } public void AddRow(params T[] values) { if (values.Length != columns.Count) throw new ArgumentException(); for (var column = 0; column < columns.Count; column++) { columns[column].Add(values[column]); } } public void DeleteRow(int row) { foreach (var c in columns) { c.RemoveAt(row); } } public void AddColumn() { var newColumn = new List<T>(); for (var rows = 0; rows < Count; rows++) { newColumn.Add(default(T)); } columns.Add(newColumn); } public override string ToString() => string.Join(Environment.NewLine, Rows.Select(c => string.Join(";", c))); ,但您可以构建自己的基本类而不需要太多模糊:

List<List<object>>

如果每个列都可以拥有自己的类型,那么相同的代码只会使其成为非通用的,并且内部存储为{{1}}。

免责声明:此代码尚未经过测试,看起来不错,但它必然会有一些愚蠢的错误......