我需要的是一个可以随时用新列(以及行)扩展的表。使用 DataTable 似乎有点矫枉过正,因为我不需要任何关系功能,也不需要数据绑定(bind),而我确实需要对相当大量的数据进行高速操作(例如,存储一百万行和一些列,并且能够添加例如一百个快速新列)。
目前最好的方法似乎是预先分配一个简单的冗余大小的二维数组。还有更好的方法吗?
最佳答案
除了已经提到的 DataTable
之外,没有任何内置类可以提供此功能。 ,但您可以构建自己的基本版本,而无需太多模糊:
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>>
即可工作。 .
免责声明:此代码尚未经过测试,看起来不错,但肯定会有一些愚蠢的错误...
关于c# - 如何在 C# 中表示可扩展的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45372271/