C#中的多维数据结构

时间:2009-06-08 19:03:15

标签: .net data-structures multidimensional-array

我想构建一个数据结构,它基本上是一个包含以下内容的字符串矩阵。

  1. 可成长的行数
  2. A FIXED no of columns
  3. 我希望能够通过方法调用获取特定行或列中的任何内容,该方法调用将整数行no和int col号作为参数。另外,我希望能够设置使用行和列号的列的值。

    我可以自己做这件事,但我很乐意看到其他人可能做的事情......

    编辑对不起列列表将被修复,我的错误: - (

6 个答案:

答案 0 :(得分:5)

DataTable和DataSet(基本上是数据表的集合)可以很好地满足您的需求。

然后,您可以通过以下语法访问您的数据(一旦设置了列并添加了数据行):

datatable.rows(index)("ColumnName")

datatable.rows(rowindex)(columnindex)

答案 1 :(得分:3)

听起来像数据表是最简单的选择。

答案 2 :(得分:3)

如果您需要两个以上的维度,或者想要更通用的解决方案,您可以使用List<List<T>>使其工作,根据需要进行深度嵌套,如果您需要更多特定功能,则将其包装为自定义类型或者想要更简单的方法调用。

答案 3 :(得分:2)

如何在Dictionary<System.Drawing.Point, string>上做点什么?这样你就可以写了;

stringGrid.Add(new Point(3,4), "Hello, World!");

创建一个包含这样一个字典的类,然后你几乎可以免费获得你想要的东西。像(未经测试的)

之类的东西
class StringGrid
{
    Dictionary<System.Drawing.Point, string> grid;

    public StringGrid
    {
        this.grid = new Dictionary<System.Drawing.Point, string>();
    }

    public string Get(int x, int y)
    {
        string result = null;
        grid.TryGetValue(new Point(x,y), out result);
        return result;
    }

    public void Set(int x, int y, string content)
    {
        var pos = new Point(x,y);
        if (grid.ContainsKey(pos))
        {
            if (content == null)
            {
                // no content, so just clear the cell.
                grid.remove(pos);
            }
            else
            {
                // add new content
                grid[pos].Value = content;
            }  
        } 
        else if (content != null)
        {
            // new non-null content
            grid.add(pos, content);
        }
    }
}

编辑:此外,如果你想真正闪光;

  • SortedList<,>
  • 替换字典
  • System.Drawing.Point替换为您自己的实现IComparable
  • 的结构

这样,列表将按行在内部排序,然后按列排序,使得一个简单的foreach循环足以迭代第一行中的所有值,然后是第二行中的值,依此类推。允许您转换为和`IEnumerable`` - 或行集合。

答案 4 :(得分:2)

如果我想要/需要自己动手(说我不想处理DataTable / DataSet),那么我会在List<List<T>>周围写一些东西(或者List<List<object>>)作为行列表,然后是具有逻辑的列,以使列表保持矩形。

  • AddRow()会添加一个新的外部列表条目。
  • AddColumn()会向内部列表中的所有列表添加新项目。
  • this[int row, int col]将访问this._Data[row][col]

类似的东西。

如果我想要命名列,则切换到Dictionary<K, List<V>>(然后列表包含该列的行数据)。

答案 5 :(得分:2)

如果您希望它可以在两个方向上展开,那么DataTable不是最好的选择。

对于界面,您可以使用索引器属性:

class Foo 
{   
    public string this[int x, int y]
    {
        get { return GetData(x,y); }
    }
}

对于后端存储,最佳选择取决于预期的使用情况,即是否会有大量空单元格。你可以定义一个

struct Index { public readonly int X, Y; }

并覆盖Equals()和GetHashCode()成员。最近在SO上有几个问题。

之后,使用Dictionary < Index, string>

您仍然需要管理行和列限制,并且可能会拦截获取空单元格。