我需要的是一个可以随时使用新列(以及行)扩展的表。使用DataTable似乎有些过分,因为我不需要任何关系功能或数据绑定,而我确实需要对相当大量的数据进行高速操作(例如,存储一百万行的某些列并且能够添加例如快速推出数百个新专栏。
至于现在,最好的方法似乎是预先分配一个冗余大小的简单2D数组。有没有更好的方法?
答案 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}}。
免责声明:此代码尚未经过测试,看起来不错,但它必然会有一些愚蠢的错误......