我想构建一个数据结构,它基本上是一个包含以下内容的字符串矩阵。
我希望能够通过方法调用获取特定行或列中的任何内容,该方法调用将整数行no和int col号作为参数。另外,我希望能够设置使用行和列号的列的值。
我可以自己做这件事,但我很乐意看到其他人可能做的事情......
编辑对不起列列表将被修复,我的错误: - (
答案 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>
您仍然需要管理行和列限制,并且可能会拦截获取空单元格。