c# - 如何在 C# 中表示可扩展的二维数组?

标签 c# data-structures types

我需要的是一个可以随时用新列(以及行)扩展的表。使用 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/

相关文章:

c# - 表达式树中的 ArrayAccess 与 ArrayIndex

java - 使用 avro 序列化将整个 Json 发送到 kafka?

c# - C# 的小数类型记帐安全吗?

r - 数据列表到数据矩阵 matlab/R

sql - Postgres 查询整数列开头的数字

types - Concoqtion (Coq + MetaOCaml) - 为什么放弃?

c# - "The maximum message size quota for incoming messages (65536) has been exceeded."。即使在设置更大的尺寸之后

c# - 使用 C# 的相对路径

c# - 为什么 sizeof(Point) 是 8?

java - java中的图像图标、列表和随机