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

时间:2011-06-13 22:10:33

标签: c# arrays collections

我想创建一个c#数据结构,它具有可变数量的列和可变数量的行。我将值插入'单元格'。我希望能够使用字符串而不是整数来索引列和行,以便我可以按如下方式处理这些单元格:infotable(“pete”,“monday”)= 3,或infotable(“mike”,“星期五“)++。当我遇到一个尚不存在的列名或行名时,我会将它添加到结构中。

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

满足我要求的最佳方式是什么?

感谢。

3 个答案:

答案 0 :(得分:4)

我想到了两个解决方案:

  1. 使用数据库表,包含两部分字符串键和值字段。这是最具扩展性的解决方案,但也是“最重的”。

  2. 创建一个简单的StringPair结构,它接受两个字符串(为应用程序提供类和成员有意义的名称),实现相等和哈希代码生成(可能只是对两个字符串中的哈希代码进行异或),然后使用一个键入StringPair的简单字典。

答案 1 :(得分:1)

如果您扩展DataTable并添加自己的功能以按字符串“索引”行,该怎么办?您可以将方法用作DataTable.Select

之类的包装器

答案 2 :(得分:1)

以下示例代码将执行您想要的操作:

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"];