由列和行字符串值键控的C#矩阵
本文关键字:矩阵 字符串 | 更新日期: 2023-09-27 17:58:59
我想创建一个具有可变列数和可变行数的c#数据结构。我将在"单元格"中插入值。我希望能够使用字符串而不是整数对列和行进行索引,这样我就可以按如下方式对这些单元格进行寻址:infotable("pete","monday")=3,或infotable("mike","friday")++。当我遇到还不存在的列名或行名时,我会将其添加到结构中。
我考虑过使用嵌套集合,但我不能保证每个嵌套集合都包含与所有其他嵌套集合相同的键(除非我手动管理)。我曾考虑过使用DataTables,但后来无法使用字符串对行进行索引。
满足我的要求最简洁的方法是什么?
谢谢。
想到两种解决方案:
-
使用由两部分组成的字符串键和值字段的数据库表。这是最具可扩展性的解决方案,但也是"最重的"解决方案。
-
创建一个简单的StringPair结构,它接受这两个字符串(为应用程序为类和成员提供有意义的名称),实现相等和哈希代码生成(可能只是将两个字符串中的哈希代码异或),然后使用一个基于该StringPair的简单Dictionary。
如果扩展DataTable
并添加自己的功能来按字符串"索引"行,会怎么样?您可以将该方法用作DataTable.Select
的包装器
以下示例代码将执行您想要的操作:
public class InfoTable
{
Dictionary<string, int> _collection;
public InfoTable()
{
_collection = new Dictionary<string,int>();
}
public int this[string col,string row] {
get
{
string colrow = col+"_"+row;
if (_collection.ContainsKey(colrow))
return _collection[colrow];
_collection.Add(colrow, 0);
return 0;
}
set
{
string colrow = col + "_" + row;
if (_collection.ContainsKey(colrow))
_collection[colrow] = value;
else
_collection.Add(colrow, value);
}
}
}
以下是使用方法:
InfoTable it = new InfoTable();
it["mike", "friday"] = 1;
it["mike", "friday"]++;
int val = it["mike", "friday"];