由列和行字符串值键控的C#矩阵

本文关键字:矩阵 字符串 | 更新日期: 2023-09-27 17:58:59

我想创建一个具有可变列数和可变行数的c#数据结构。我将在"单元格"中插入值。我希望能够使用字符串而不是整数对列和行进行索引,这样我就可以按如下方式对这些单元格进行寻址:infotable("pete","monday")=3,或infotable("mike","friday")++。当我遇到还不存在的列名或行名时,我会将其添加到结构中。

我考虑过使用嵌套集合,但我不能保证每个嵌套集合都包含与所有其他嵌套集合相同的键(除非我手动管理)。我曾考虑过使用DataTables,但后来无法使用字符串对行进行索引。

满足我的要求最简洁的方法是什么?

谢谢。

由列和行字符串值键控的C#矩阵

想到两种解决方案:

  1. 使用由两部分组成的字符串键和值字段的数据库表。这是最具可扩展性的解决方案,但也是"最重的"解决方案。

  2. 创建一个简单的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"];